当前位置: 首页 > news >正文

二十三种设计模式:解密职责链模式-购物优惠活动的设计艺术


在购物领域,为了吸引和激励消费者,商家常常会推出各种优惠活动,比如满减、打折、赠品等。然而,这些优惠活动的处理逻辑通常较为复杂,需要根据购物订单的条件进行判断和处理。本文将深入探讨职责链模式的实现方式,帮助你设计和实现购物优惠活动的灵活而可扩展的系统。


1、创造优惠的链条
职责链模式是一种行为设计模式,它通过将请求发送者和接收者解耦,将请求沿着一个处理者链条进行传递和处理。在购物优惠活动中,我们可以将不同类型的优惠券视为处理者对象,每个处理者对象负责处理特定类型的优惠逻辑。请求将依次经过处理者对象,根据购物订单的条件进行优惠处理,直到找到能够处理请求的处理者对象或者达到职责链的末尾。


2、详细案例代码

假设我们正在设计一个购物优惠活动系统,系统中有三种优惠券类型:满减、打折和赠品。我们可以使用职责链模式来处理这些优惠券的逻辑。


首先,我们定义一个抽象处理者类和具体处理者类:

// 抽象处理者
abstract class CouponHandler {protected CouponHandler nextHandler;public void setNextHandler(CouponHandler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleCoupon(Order order);
}// 具体处理者
class DiscountCouponHandler extends CouponHandler {public void handleCoupon(Order order) {if (order.getTotalAmount() >= 100) {double discount = order.getTotalAmount() * 0.1;order.setTotalAmount(order.getTotalAmount() - discount);System.out.println("Discount coupon applied. Total amount after discount: " + order.getTotalAmount());} else if (nextHandler != null) {nextHandler.handleCoupon(order);}}
}class FreeGiftCouponHandler extends CouponHandler {public void handleCoupon(Order order) {if (order.getTotalAmount() >= 200) {order.addGift("Free T-shirt");System.out.println("Free gift coupon applied. Gift added: Free T-shirt");} else if (nextHandler != null) {nextHandler.handleCoupon(order);}}
}class FullReductionCouponHandler extends CouponHandler {public void handleCoupon(Order order) {if (order.getTotalAmount() >= 300) {double reduction = 50;order.setTotalAmount(order.getTotalAmount() - reduction);System.out.println("Full reduction coupon applied. Total amount after reduction: " + order.getTotalAmount());} else if (nextHandler != null) {nextHandler.handleCoupon(order);}}
}

然后,我们定义一个订单类和职责链构建器类:

// 订单类
class Order {private double totalAmount;private List<String> gifts;public Order(double totalAmount) {this.totalAmount = totalAmount;}public double getTotalAmount() {return totalAmount;}public void setTotalAmount(double totalAmount) {this.totalAmount = totalAmount;}public void addGift(String gift) {if (gifts == null) {gifts = new ArrayList<>();}gifts.add(gift);}public void showGifts() {if (gifts != null && !gifts.isEmpty()) {System.out.println("Gifts:");for (String gift : gifts) {System.out.println("- " + gift);}}}
}// 职责链构建器
class CouponChainBuilder {public CouponHandler build() {CouponHandler discountHandler = new DiscountCouponHandler();CouponHandler freeGiftHandler = new FreeGiftCouponHandler();CouponHandler fullReductionHandler = new FullReductionCouponHandler();discountHandler.setNextHandler(freeGiftHandler);freeGiftHandler.setNextHandler(fullReductionHandler);return discountHandler;}
}

最后,我们在客户端中使用职责链模式处理购物优惠券:

public class Client {public static void main(String[] args) {Order order = new Order(250);CouponChainBuilder builder = new CouponChainBuilder();CouponHandler handler = builder.build();handler.handleCoupon(order);order.showGifts();}
}

运行上述代码,输出如下:

Discount coupon applied. Total amount after discount: 225.0
Free gift coupon applied. Gift added: Free T-shirt
Gifts:
- Free T-shirt

这个例子中,订单的总金额为250元,首先满足打折优惠券的条件,总金额减少了10%,然后满足赠品优惠券的条件,赠品"Free T-shirt"被添加到订单中。


本文详细介绍了职责链模式在购物优惠活动中的实现方式。通过职责链模式,我们可以将不同类型的优惠券逻辑解耦并灵活组合,实现购物优惠活动的多级处理。


职责链模式的设计艺术不仅仅适用于购物优惠活动,还可以应用于许多其他场景,比如请求处理等。通过合理构建职责链,我们可以实现灵活、可扩展的系统。在下一篇博文中,我们将探索职责链模式在请求处理中的应用,敬请期待!


好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。


相关文章:

二十三种设计模式:解密职责链模式-购物优惠活动的设计艺术

在购物领域&#xff0c;为了吸引和激励消费者&#xff0c;商家常常会推出各种优惠活动&#xff0c;比如满减、打折、赠品等。然而&#xff0c;这些优惠活动的处理逻辑通常较为复杂&#xff0c;需要根据购物订单的条件进行判断和处理。本文将深入探讨职责链模式的实现方式&#…...

竞赛 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…...

unexpected end of stream on

SpringCloud使用FeignClient调用第三方接口报错unexpected end of stream on ; 解决方法&#xff1a; 1.检查服务器端口是否被占用 lsof -i:端口&#xff1b; 2.nacos添加超时配置&#xff1a;...

【微信小程序篇】- 组件

最近自己在尝试使用AIGC写一个小程序&#xff0c;页面、样式、包括交互函数AIGC都能够帮我完成(不过这里有一点问题AIGC的上下文关联性还是有限制&#xff0c;会经常出现对于需求理解跑偏情况&#xff0c;需要不断的重复强调&#xff0c;并纠正错误&#xff0c;才能得到你想要的…...

使用Sqoop命令从Oracle同步数据到Hive,修复数据乱码 %0A的问题

一、创建一张Hive测试表 create table test_oracle_hive(id_code string,phone_code string,status string,create_time string ) partitioned by(partition_date string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ,; 创建分区字段partition_date&#xff0c…...

NC Cloud uploadChunk文件上传漏洞复现

简介 NC Cloud是指用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。该产品uploadChunk文件存在任意文件上传漏洞。 漏洞复现 FOFA语法&#xff1a; app"用友-NC-Cloud" 访问页面如下所示&#xff1a; POC&#xff1a;/ncchr/pm/fb/…...

多标签页之间的通信

解决方案有两种思路&#xff1a;浏览器端解决方案、服务器端解决方案。 一、浏览器端解决方案&#xff1a; 思路&#xff1a;本地数据存储 <!-- index01.html --> <input id"name"> <input type"button" id"btn" value"…...

CI/CD -gitlab

目录 一、常用命令 二、部署 一、常用命令 官网&#xff1a;https://about.gitlab.com/install/ gitlab-ctl start # 启动所有 gitlab 组件 gitlab-ctl stop # 停止所有 gitlab 组件 gitlab-ctl restart # 重启所有 gitlab 组件 gitlab-ctl statu…...

AR眼镜_单目光波导VS双目光波导方案

双目光波导AR眼镜方案是一种创新的智能设备&#xff0c;可以在现实场景中叠加虚拟信息&#xff0c;提供增强的视觉体验和交互体验。光学显示方案是AR眼镜的核心技术之一&#xff0c;它对眼镜的性能和使用体验起着决定性的作用。 相比于单目AR眼镜&#xff0c;双目AR眼镜具有更好…...

golang 动态库 (buildmode)

目录 1. golang 动态库2. Golang 生成 C 动态库 .so 和静态库 .a2.1. 源代码2.2. 编译2.3. C2.4. 执行2.5. 如何生成静态库2.6. Go 调用 C 库2.6.1. 源代码 3. golang 语言使用动态库、调用动态链接库3.1. Go 插件系统3.2. 动态加载的优劣3.3. Go 的插件系统: Plugin3.4. 插件开…...

【mysql】2006 - Server has gone away

执行了一组插入语句 提示&#xff1a;2006 - Server has gone away&#xff1b; 2006-服务器已经消失&#xff1b; 消失去哪里了&#xff0c;被黑洞吞没了吗&#xff1f;&#xff01;&#xff01;&#xff01; 网络问题 网络不稳定&#xff1f;断网了&#xff1f;检查网络连…...

动态规划43(Leetcode91解码方法)

代码&#xff1a; class Solution {public int numDecodings(String s) {int n s.length();if(s.charAt(0)0)return 0;if(n1)return 1;int[] dp new int[n1];dp[0]1;dp[1]1;for(int i2;i<n;i){if(s.charAt(i-2)1){dp[i]dp[i-2];}else if(s.charAt(i-2)2&&s.charA…...

STM32电源名词解析

先来简单了解一下各种电源端口的命名 VCC&#xff1a;Ccircuit 表示电路的意思, 即接入电路的电压 VDD&#xff1a;Ddevice 表示器件的意思, 即器件内部的工作电压。 VSS&#xff1a;Sseries 表示公共连接的意思&#xff0c;通常指电路公共接地端电压。 GND&#xff1a;在电…...

openAI宫斗感想 chatGPT带给客户巨大利益的就是王者。王者终究会归来。技术人员不要总是想掌握所有核心技术并用到极致。

1.我很喜欢乔布斯用的iCEO&#xff0c;每个人的工作都是临时的&#xff0c;打掉铁饭碗才会有效率。有铁饭碗就容易使人怠慢、傲慢、嚣张、低效率的消耗自己和别人的生命。日本人为什么对每个人每个客户都毕恭毕敬&#xff0c;感觉因为他的饭碗都掌握在周围的人手里。 日本文化…...

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

参考&#xff1a;https://www.cnblogs.com/sam-snow-v/p/15917898.html eclipse链接SQL Server出现问题 笔者使用Open JDK 17&#xff0c;SQL Server 2016&#xff0c;项目中使用JPA操作数据库。测试环境没问题&#xff0c;生产环境出现如题所示“驱动程序无法通过使用安全套接…...

性能调优第一步:服务器硬件如何选型

硬件选型是调优的第一步&#xff0c;无论你是自行购买服务器进行托管&#xff0c;还是租用服务器&#xff0c;或者购买云主机&#xff0c;都要面临的一个问题&#xff0c;那就是选择服务器的硬件配置&#xff0c;因为没有一台服务器能满足所有需求&#xff0c;解决所有的问题。…...

Codewhisperer 使用评价

最近亚⻢逊推出了一款基于机器学习的 AI 编程助手 Amazon CodeWhisperer&#xff0c;可以实时提供代码建议。在编写代码时&#xff0c;它会自动根据现有的代码和注释给出建议。Amazon CodeWhisperer 与GitHub Copilot类似&#xff0c;主要的功能有: 代码补全注释和文档补全代码…...

结合scss实现黑白主题切换

是看了袁老师的视频后&#xff0c;自己做了一下练习。原视频地址&#xff1a; b站地址https://www.bilibili.com/video/BV15z4y1N7jB/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_sourcec6cf63302f28d94ebc02cbedcecc57ea首先创建一个全局的scs…...

go-zero对数据库的操作

一、go-zerro中结合gorm来操作mysql数据库 1、这里我这就直接结合gorm-gen的方式来实现数据库操作,关于gorm-gen可以参考官网 2、创建一个数据库&#xff0c;并且创建一个表 -- ------------------------ -- 用户表 -- ------------------------ DROP TABLE IF EXISTS user; C…...

Mac git查看分支以及切换分支

查看本地分支 git branch 查看远程仓库分支 git branch -r 查看本地与远程仓库分支 git branch -a 切换分支 git checkout origin/dev/js...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...