责任链模式应用案例

news/2024/5/19 16:03:21 标签: 责任链模式

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

一、概念

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

二、结构

责任链模式包含三个角色

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

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

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

最简单代码

三、实例应用案例

案例一

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


http://www.niftyadmin.cn/n/5125483.html

相关文章

Kubernetes (K8S)概述

目录 1、K8S 是什么&#xff1f; 1.1 作用 1.2 由来 1.3 含义 1.4 官网 2、为什么要用 K8S? 2.1 K8S 解决了裸跑Docker 的若干痛点 2.2 K8S主要功能如下 2.3 K8S 的特性 3、Kubernetes 集群架构与组件 3.1 核心组件 3.1.1 Master 组件 3.1.2 控制器主要包括 3.1…

MS31804四通道低边驱动器可替代DRV8804(串行数据接口控制,4个低边功率驱动,内置高侧续流二极管)

MS31804TE 是一个具有过流保护功能的四通道 低边驱动器。 MS31804TE 内置钳位二极管&#xff0c;用来钳 制由电感负载续流产生的电压。 MS31804TE 可以驱 动单极步进电机、直流电机、继电器、螺线管或者 其它负载。 散热良好的情况下&#xff0c; MS31804TE 可以提供每…

Win安装protobuf和IDEA使用protobuf插件

一、Win安装protobuf 1、下载编译器 protobuf下载地址&#xff1a;https://github.com/protocolbuffers/protobuf/releases 选择自己需要的版本下载&#xff0c;这里下载的是 protoc-3.19.1-win64.zip&#xff0c;下载之后进行解压即可。 2、配置环境变量 path 系统变量中添加…

Istio 自动注入 sidecar 失败导致无法访问webhook服务

最近工作中在部署Istio环境的过程中发现官方示例启动的pod不能访问不到Istio的webhook&#xff0c;这个问题也是困扰了我一天&#xff0c;特此记录&#xff0c;便于日后查阅。 我把他归类到sidecar注入失败的情况&#xff0c;报错如下&#xff1a; 1、第一种可能&#xff08;我…

MySQ 内存使用率高

关键字 MySQL 内存高 问题描述 项目上数据库32G内存服务器&#xff0c;在buffer_pool给了10G&#xff0c;没有大SQL运行的情况下实际占用了28G。 解决问题思路 默认内存分配器可能存在分配内存不回收的问题 -- 运行以下命令如果内存减少&#xff0c;可以考虑更新内存分配…

json读写

import json # 读取json_data_out.json文件 with open(json_data_out_1023_1.json, "r", encoding"utf-8") as json_file:data json.load(json_file)model_data_out []for item in data:# 更新字典字段item["topic"] []item["label"…

写新闻稿的基本步骤有哪些?纯干货!

新闻稿作为企业和品牌传递信息的重要载体&#xff0c;不仅要求准确、客观&#xff0c;还应该要具备吸引人的特质。本文伯乐网络传媒将为您详细解析写新闻稿的基本步骤&#xff0c;帮助您轻松撰写出高质量、具有深度的新闻稿。 一、选定热门话题&#xff1a;寻找具有吸引力的爆点…

JVM相关的面试题

一、什么是程序计数器 二、简要的介绍一下堆 三、什么是虚拟机栈 四、能不能解释下方法区 五、你听过直接内存吗&#xff1f; 六、什么是类加载器&#xff0c;类加载器有哪些 七、什么是双亲委派模型 八、JVM为什么采用双亲委派机制 九、类装载的执行过程 十、对象什么时候被垃…