责任链模式应用案例

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

一、概念

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

二、结构

责任链模式包含三个角色

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

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

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

最简单代码

三、实例应用案例

案例一

系统由市场部针对当前行情定义折扣,可以按门店、按类目、按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各种开源框架如果不熟悉设计模式也很困难,但对于业务层设计模式的应用则需要慎重一些,尤其是对于团队成员水平参差不齐,人员稳定性差的团队,如果对设计模式理解不透容易造成误用,使得代码维护变得更困难,适度,适度,适度!

相关推荐
小白不太白9501 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in1 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
你知道烟火吗2 天前
springboot:责任链模式实现多级校验
spring boot·后端·责任链模式
拉里小猪的迷弟6 天前
设计模式-行为型-常用-2:职责链模式、状态模式、迭代器模式
java·设计模式·迭代器模式·状态模式·责任链模式
G皮T6 天前
【设计模式】行为型模式(三):责任链模式、状态模式
java·设计模式·状态模式·编程·责任链模式·state
前端拾光者9 天前
前端开发设计模式——责任链模式
设计模式·责任链模式
老攀呀13 天前
责任链模式 Chain of Responsibility
责任链模式
萌面小侠Plus13 天前
Android笔记(三十五):用责任链模式封装一个App首页Dialog管理工具
android·dialog·笔记·kotlin·责任链模式
后端小张13 天前
设计模式讲解02—责任链模式(Chain)
java·开发语言·设计模式·责任链模式
wrx繁星点点14 天前
责任链模式(Chain of Responsibility Pattern)详解
java·开发语言·设计模式·责任链模式