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

责任链模式应用案例

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

一、概念

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

二、结构

责任链模式包含三个角色

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

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

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

最简单代码

三、实例应用案例

案例一

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

相关文章:

责任链模式应用案例

前几天系统商品折扣功能优化&#xff0c;同事采用了责任链模式重构了代码&#xff0c;现整理如下。 一、概念 责任链模式是为请求创建一个处理者对象的链条&#xff0c;所有处理者&#xff08;除最末端&#xff09;都含有下一个对象的引用从而形成一条处理链&#xff0c;该模…...

给你一个整数 num ,返回 num 中能整除 num 的数位的数目

给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 示例 1&#xff1a; 输入&#xff1a;num 7 输出&#xff1a;1 解释&#xff1a;7 被自己整除&#xff0c;因此答案是 1 。 示例 2&…...

Java后端开发——房贷计算器(Ajax版、Json版、等额本息+等额本金)

MVC房贷计算器&#xff08;Ajax版&#xff09; 1.新建一个JavaWeb项目hslcalweb&#xff0c;设置tomcat10。 2.创建房贷计算器JavaBean&#xff1a;HslCalBean.java&#xff0c;增加以下的属性&#xff0c;并生成Getter/Setter方法。 private double total; //贷款额度pr…...

2023.10.28 关于 synchronized 原理

目录 synchronized 特性 synchronized 优化机制 锁升级&#xff08;锁膨胀&#xff09; 其他优化机制 锁消除 锁粗化 synchronized 特性 开始时是乐观锁&#xff0c;如果锁冲突频繁&#xff0c;就转为悲观锁开始是轻量级锁&#xff0c;如果锁被持有的时间较长&#xff0c…...

力扣 27. 移除元素

目录 1.解题思路2.代码实现 1.解题思路 利用双指针思路&#xff0c;当让一个指针先走&#xff0c;指针指向的位置不等于val时&#xff0c;将此时该指针的值给另一个指针并且两个指针都加一&#xff0c;如果等于val,则让该指针加一继续走.最后另一个指针的下标就为排好的数组的…...

redis爆满导致数据丢失

记一则redis爆满导致数据丢失的一场事故 某功能上线后&#xff0c;发现出现问题&#xff0c;最后定位到了 redis. 由于存储的数据过多&#xff0c;导致阿里云4G大小的 redis 爆满&#xff0c;触发了回收策略。 于是临时扩容,运维同学当时未找到阿里云配置。 后面我用工具连接了…...

Android14 WMS启动流程

一 概述 本文Android14源代码可参考&#xff1a;Search 在 Android 系统中&#xff0c;从设计的角度来看&#xff0c;窗口管理系统是基于 C/S 模式的。整个窗口系统分为服务端和客户端两大部分&#xff0c;客户端负责请求创建窗口和使用窗口&#xff0c;服务端完成窗口的维护…...

磁盘管理(初始化,引导块,坏块管理,固态硬盘)

目录 1.磁盘初始化2.引导块3.坏块的管理1.坏块检查2.坏块链表3.扇区备用 4.固态硬盘&#xff08;SSD&#xff09;1.原理2.组成3.读写性能特性4.与机械硬盘相比5.磨损均衡技术 1.磁盘初始化 ①进行低级格式化&#xff08;物理格式化&#xff09;&#xff0c;将磁盘的各个磁道划分…...

mysql冷拷贝大表

1、简述&#xff1a; mysql数据迁移有多种方式&#xff0c;最常见的就是先把数据库导出&#xff0c;然后导入新的数据库。拷贝数据目录data是另外一种方式。 尤其是当数据库启动不了&#xff0c;或者大型数据库迁移的时候&#xff0c;可以考虑这个方式。 2、场景&#xff1a…...

苍穹外卖-01

苍穹外卖-01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一名…...

GAMP源码阅读(中)伪距单点定位 SPP

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、SPP 解算1、spp()&#xff1a;单点定位主入口函数2、estpos()3、estpose_()4、valsol()&#xff1a;GDOP和卡方检验结果有效性 二、卫星位置钟…...

Epinoia-有状态网络的意图验证模块,略读

Epinoia relies on a unified model for NFs by leveraging the causal precedence relationshipsthat exist between NF packet I/Os and states. 这句话的意思是&#xff1a;“Epinoia依靠一种统一的网络功能&#xff08;NF&#xff09;模型&#xff0c;通过利用存在于 NF 包…...

14.力扣c++刷题-->有效括号

题目&#xff1a;给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合…...

scrapy-redis分布式爬虫(分布式爬虫简述+分布式爬虫实战)

一、分布式爬虫简述 &#xff08;一&#xff09;分布式爬虫优势 1.充分利用多台机器的带宽速度 2.充分利用多台机器的ip地址 &#xff08;二&#xff09;Redis数据库 1.Redis是一个高性能的nosql数据库 2.Redis的所有操作都是原子性的 3.Redis的数据类型都是基于基本数据…...

单目深度估计之图像重构原理解析

一、参考资料 浅析自监督深度估计中的光度损失(Photometric Loss) 二、图像重构原理 设输入位姿估计网络的3帧连续单目序列为 < I t − 1 , I t , I t 1 > <I_{t-1},I_{t},I_{t1}> <It−1​,It​,It1​>&#xff0c;其中 t t t 为时间索引&#xff0c;…...

【爬虫】charles手机抓包环境设置(设置系统证书)

1.说明 想要对手机抓包&#xff0c;最关键的是需要设置好根证书&#xff0c;用户证书在安卓7.0之后就不受信任了&#xff0c;想要对手机app抓包&#xff0c;就需要把用户证书设置为系统证书&#xff08;根证书&#xff09; 注意&#xff0c;想要设置为根证书&#xff0c;你的…...

【flink sql table api】时间属性的指定与使用注意事项

文章目录 一. 时间属性介绍二. Table api指定时间属性三. 处理时间的指定1. 在创建表的 DDL 中定义2. 在 DataStream 到 Table 转换时定义3. 使用 TableSource 定义 四. 事件时间的指定1. 在 DDL 中定义2. 在 DataStream 到 Table 转换时定义3. 使用 TableSource 定义 五. 小结…...

评价模型:CRITIC客观赋权法

目录 1.算法原理介绍2.算法步骤2.1 数据标准化2.2 计算信息承载量2.3 计算权重和得分 3.案例分析 1.算法原理介绍 CRITIC方法是一种客观权重赋权法&#xff0c;其基本思路是确定指标的客观权数以两个基本概念为基础。一是对比强度&#xff0c;它表示同一指标各个评价方案取值差…...

两个Tomcat插件配置不同端口,session冲突,同时登录被挤下线问题的解决

如果是配置了两个Tomcat的插件&#xff0c;在同一ip有两个需要同时登录的项目&#xff0c;可以在其中一个web项目的web.xml文件里添加session命名的配置&#xff0c;如下&#xff1a; <!--配置不同的session&#xff0c;避免管理端和手机端两个同时登录被挤下线--><se…...

Mybatis中执行Sql的执行过程

MyBatis中执行SQL的过程可以分为以下几个步骤&#xff1a; 解析配置文件&#xff1a;在运行时&#xff0c;MyBatis会加载并解析配置文件&#xff08;通常为mybatis-config.xml&#xff09;&#xff0c;获取数据库连接信息、映射文件等。 创建SqlSessionFactory&#xff1a;MyB…...

抖音下载器技术解析:突破平台限制的高效内容获取方案

抖音下载器技术解析&#xff1a;突破平台限制的高效内容获取方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...

新手友好:基于快马平台快速上手dhnvr416h-hd设备数据监控开发

新手友好&#xff1a;基于快马平台快速上手dhnvr416h-hd设备数据监控开发 最近在做一个物联网项目&#xff0c;需要对接dhnvr416h-hd设备的数据监控功能。作为刚接触这个领域的新手&#xff0c;我发现理解设备数据格式和通信流程是最关键的第一步。好在通过InsCode(快马)平台的…...

高效突破语言壁垒:KISS Translator的全场景翻译解决方案

高效突破语言壁垒&#xff1a;KISS Translator的全场景翻译解决方案 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.c…...

从GlobeLand30数据到统计报表:QGIS分区统计+Excel,打造你的地表覆盖分析工作流

从GlobeLand30到专业报表&#xff1a;QGISExcel高效地表覆盖分析全流程 地表覆盖数据是理解区域生态环境、规划土地利用的重要基础。GlobeLand30作为30米分辨率的全球地表覆盖数据集&#xff0c;为研究者提供了高精度的分析素材。但如何将这些数据转化为可操作的见解&#xff1…...

JAVA-- 突破默认限制:在Java8 Parallel Stream中高效管理自定义线程池

1. 为什么需要自定义线程池管理Parallel Stream Java8引入的Parallel Stream确实让并行编程变得简单&#xff0c;但很多开发者在使用过程中会发现一个尴尬的事实&#xff1a;所有并行流操作默认共享同一个ForkJoinPool公共线程池。这就好比小区里所有住户共用一个电表&#xff…...

高光谱分类别只盯着精度?聊聊Salinas数据集实战中的那些‘隐形’优化点

高光谱分类实战&#xff1a;超越精度的Salinas数据集深度优化指南 当我们在Salinas数据集上实现98%的分类准确率时&#xff0c;是否意味着模型已经完美&#xff1f;作为深耕遥感领域多年的技术顾问&#xff0c;我必须指出&#xff1a;高光谱图像分类的工程实践远比表面指标复杂…...

「码动四季·开源同行」go实战案例:如何在 Go 微服务中实现负载均衡?

在上文章中&#xff0c;我们已经介绍了负载均衡的相关概念以及在服务高可用架构中的重要性&#xff0c;也了解了几种主流负载均衡算法的实现。在本文中&#xff0c;我们将在Go微服务实例中具体使用负载均衡技术&#xff0c;并详细说明如何基于服务发现来实现负载均衡的微服务间…...

深度解析:Element Plus架构设计与实现原理

深度解析&#xff1a;Element Plus架构设计与实现原理 【免费下载链接】element-plus &#x1f389; A Vue.js 3 UI Library made by Element team 项目地址: https://gitcode.com/GitHub_Trending/el/element-plus Element Plus作为Vue.js 3生态中最具影响力的企业级UI…...

告别重复造轮子:用快马AI一键生成高复用性imToken集成代码模块

告别重复造轮子&#xff1a;用快马AI一键生成高复用性imToken集成代码模块 开发涉及钱包集成的DApp时&#xff0c;最让人头疼的就是那些重复性的基础代码。每次新项目都要重新写一遍连接钱包、处理授权、监听网络切换的逻辑&#xff0c;不仅浪费时间&#xff0c;还容易引入安全…...

QwQ-32B+ollama实战案例:气象模型参数推理与极端天气归因分析

QwQ-32Bollama实战案例&#xff1a;气象模型参数推理与极端天气归因分析 1. 引言&#xff1a;当AI遇到气象科学 最近几年&#xff0c;极端天气事件越来越频繁&#xff0c;从罕见高温到突发暴雨&#xff0c;都给我们的生活带来了不小的影响。作为气象研究人员&#xff0c;我们…...