• 责任链模式应用案例


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

    一、概念

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

    二、结构

    责任链模式包含三个角色

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

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

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

    最简单代码

    三、实例应用案例

    案例一

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

    1、DiscountChain.java 

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

    2、AbstractDiscount.java

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

    3、StoreDiscount.java等

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

    ProductDiscount.java

    4、ProductPriceMgr.java

    案例二

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

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

  • 相关阅读:
    【论文阅读】Deep Reinforcement Learning amidst Continual Structured Non-Stationarity
    Set a Light 3D Studio:探索光影艺术的全新维度mac/win中文版
    [Linux系统编程]_进程的通信(三)
    npm yarn 一起使用报错
    加速鸿蒙生态共建,蚂蚁mPaaS助力鸿蒙原生应用开发创新
    nlp自然语言处理
    「五度情报站」网罗全量企业情报,找客户、查竞品、寻商机!
    使用springboot实现jsonp|jsonp的实现|JSONP的实现使用springboot
    Linux运维常用命令
    Java基于SpringBoot的在线考试系统的研究与实现(附源码,教程)
  • 原文地址:https://blog.csdn.net/2301_76787421/article/details/134031146