责任链模式应用案例

前几天系统商品折扣功能优化,同事采用了责任链模式重构了代码,现整理如下。

一、概念

责任链模式是为请求创建一个处理者对象的链条,所有处理者(除最末端)都含有下一个对象的引用从而形成一条处理链,该模式主要解藕了请求和处理类,增加新的处理类比较方便,但系统性能可能会受到一定的影响。

二、结构

责任链模式包含三个角色

  • 抽角处理者角色:定义一个处理请求的接口,包含了一个抽像处理方法和一个后续连接。

  • 具体处理者角色:实现抽像处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转交给他的后续者。

  • 客户类:创建处理链,并向链头的具体处理类提交请求。

最简单代码

三、实例应用案例

案例一

系统由市场部针对当前行情定义折扣,可以按门店、按类目、按SPU(花型)、按SKU(商品)这些维度对商品设置折扣(这里暂时未整合会员折扣,收银员折扣),优先级按次序升高,SKU折扣优先级最高,如果设置了SKU折扣其它折扣不再起作用。

1、DiscountChain.java

配置类,维护责任链结构,并返回一个缺省的处理类,本例返回门店折扣处理类(这里有待商榷,更优的应该是返回SKU折扣处理器)。

2、AbstractDiscount.java

提供getMatchDiscount,调用时先调用缺省的门店折扣处理器,然后查找其下一级类目折扣处理器,再花型折扣处理器,一直找到商品SKU折扣处理器,然后依次返回,如果商品折扣有配置折扣就直接返回,否则依次调用前一级处理器。

3、StoreDiscount.java等

通过@Order设置类注入的DiscountChain List<AbstractDisoucnt>的顺序,这里门店折扣的Order设置是3,商品折扣设置的是0,配置类会将优先级最低的门店折扣做为缺省处理器注入到ProductPriceMgr的abstractDiscount(见ProductPriceMgr类).

ProductDiscount.java

4、ProductPriceMgr.java

案例二

好像还是2011年左右的事情,已经记不太清楚了,当时淘宝Vsearch数据同步有一个叫万花筒框架,采用的也是责任链模式,每一个节点调用一个后端服务整合一部分数据,比如类目数据,业务数据库中只会存储主键,但Vsearch的数据需要把相关类目名称什么都存储起来,这时就会去调用类目HSF服务获取相关类目完整数据,然后再调用优惠HSF服务获取优惠数据,调用店铺HSF获取店铺信息等,最后生成一个Document写入Vsearch中。

注:关于设计模式使用个人看法是,做底层框架为了可扩展性肯定是要用到,另外要读懂Java各种开源框架如果不熟悉设计模式也很困难,但对于业务层设计模式的应用则需要慎重一些,尤其是对于团队成员水平参差不齐,人员稳定性差的团队,如果对设计模式理解不透容易造成误用,使得代码维护变得更困难,适度,适度,适度!

相关推荐
Hello Dam5 小时前
接口 V2 完善:基于责任链模式、Canal 监听 Binlog 实现数据库、缓存的库存最终一致性
数据库·缓存·canal·binlog·责任链模式·数据一致性
新与5 小时前
设计模式:责任链模式——行为型模式
设计模式·责任链模式
拾荒的小海螺1 天前
JAVA:Spring Boot 实现责任链模式处理订单流程的技术指南
java·spring boot·责任链模式
workflower9 天前
CHAIN OF RESPONSIBILITY(职责链)—对象行为型模式
需求分析·责任链模式·uml·原型模式·软件需求·统一建模语言
ThetaarSofVenice9 天前
一个个顺序挨着来 - 责任链模式(Chain of Responsibility Pattern)
java·设计模式·责任链模式
sjsjsbbsbsn9 天前
学习记录-责任链模式验证参数
java·学习·责任链模式
zDarkBlue9 天前
责任链模式
责任链模式
目目沐沐12 天前
责任链模式
责任链模式
JINGWHALE112 天前
设计模式 行为型 责任链模式(Chain of Responsibility Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·设计模式·性能优化·系统架构·责任链模式
玉面小君16 天前
C# 设计模式(行为型模式):责任链模式
设计模式·c#·责任链模式