【设计模式-行为型】职责链模式

news/2025/1/23 6:06:05/

一、什么是职责链模式

        说到职责链模式,我头脑中想到的例子就是电影《人体蜈蚣》,不过有点血腥和恶心,所以想了想还是换一个例子形容比较好,在软件行业、建筑行业或工程项目,包工程或者包项目的项目承包大佬一个个都是责任链模式的高手,层层转包层层卡油,从总承包商开始,任务沿着层级传递,直到最终的分包商完成具体的工作。往往上千万的项目到最终分包商所剩不多。职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求的发送者和接收者解耦,让多个对象都有机会处理请求。这些对象形成一条链,请求沿着链传递,直到有对象能够处理它为止。

二、为啥使用职责链模式

        职责链模式的核心思想是将请求沿着一个链传递,直到有对象能够处理它为止。这种模式特别适用于需要多个对象依次处理请求的场景。

  1. 解耦请求和处理对象:职责链模式将请求的发送者和接收者解耦,使得请求的发起者无需知道具体的处理者是谁,只需将请求发送到链的起点即可。在工程项目中,总承包商不需要直接管理每一个具体的施工任务,而是通过分包商逐步传递任务。

  2. 动态处理请求:职责链模式允许动态地添加或移除处理者,使得系统更加灵活。在工程项目中,任务的复杂性不同,可能需要不同层级的承包商来处理

  3. 简化对象之间的交互:职责链模式简化了对象之间的交互,使得每个对象只需要与下一个对象交互,减少了对象之间的直接依赖。在工程项目中,每个层级的承包商只需要知道下一个层级的承包商是谁,而不需要知道整个任务链的全貌。

  4. 增强系统的可扩展性:职责链模式使得系统易于扩展,新的分包商可以轻松地插入到链中,而不需要修改现有的代码。

三、职责链模式示例

        下面我讲那项目分包来演示责职责链模式的DEMO

  1. 定义分包行为
    public abstract class Contractor {protected Contractor nextContractor;public void setNextContractor(Contractor nextContractor) {this.nextContractor = nextContractor;}public abstract void handleTask(String task,double amount);
    }
  2. 具体的分包商
    public class GeneralContractor extends Contractor {@Overridepublic void handleTask(String task, double amount) {System.out.println("总承包商: " + task + ", Amount: " + amount);// 总承包商扣除一定比例的费用double deductedAmount = amount * 0.5; // 假设扣除50%System.out.println("扣一层后费用: " + deductedAmount);if (nextContractor != null) {nextContractor.handleTask(task, deductedAmount);}}
    }public class FirstLevelSubcontractor extends Contractor {@Overridepublic void handleTask(String task, double amount) {System.out.println("一级分包商: " + task + ", Amount: " + amount);// 一级分包商扣除一定比例的费用double deductedAmount = amount * 0.5; // 假设扣除50%System.out.println("扣一层后费用: " + deductedAmount);if (nextContractor != null) {nextContractor.handleTask(task, deductedAmount);}}
    }public class SecondLevelSubcontractor extends Contractor {@Overridepublic void handleTask(String task, double amount) {System.out.println("二级分包商: " + task + ", Amount: " + amount);// 二级分包商扣除一定比例的费用double deductedAmount = amount * 0.5; // 假设扣除50%System.out.println("扣一层后费用: " + deductedAmount);if (nextContractor != null) {nextContractor.handleTask(task, deductedAmount);}}
    }public class ThirdLevelSubcontractor extends Contractor {@Overridepublic void handleTask(String task, double amount) {System.out.println("三级分包商: " + task + ", Amount: " + amount);// 三级分包商不再扣除费用,直接完成任务System.out.println("最终项目价格: " + amount);}
    }
  3. 分包场景
    public class Project {public static void main(String[] args) {Contractor generalContractor = new GeneralContractor();Contractor firstLevel = new FirstLevelSubcontractor();Contractor secondLevel = new SecondLevelSubcontractor();Contractor thirdLevel = new ThirdLevelSubcontractor();// 构建职责链generalContractor.setNextContractor(firstLevel);firstLevel.setNextContractor(secondLevel);secondLevel.setNextContractor(thirdLevel);// 处理任务,初始金额为10000000元generalContractor.handleTask("肥油项目", 10000000.0);}
    }//输出
    总承包商: 肥油项目, Amount: 10000000
    扣一层后费用: 5000000.0
    一级分包商: 肥油项目, Amount: 5000000.0
    扣一层后费用: 2500000.0
    二级分包商: 肥油项目, Amount: 2500000.0
    扣一层后费用: 1250000.0
    三级分包商: 肥油项目, Amount: 1250000.0
    最终项目价格: 1250000.0


http://www.ppmy.cn/news/1565413.html

相关文章

mysql数据库启动出现Plugin ‘FEEDBACK‘ is disabled.问题解决记录

本人出现该问题的环境是xampp,异常关机,再次在xampp控制面板启动mysql出现该问题。出现问题折腾数据库之前,先备份数据,将mysql目录下的data拷贝到其他地方,这很重要。 然后开始折腾。 查资料,会发现很多…

【分布式知识】Spring Cloud Gateway实现跨集群应用访问

SpringCloud Gateway实现跨集群应用访问 1. 设置服务注册中心配置 Eureka Server(示例)配置服务实例(示例) 2. 配置 Spring Cloud Gateway引入依赖配置 Gateway 3. 配置路由规则4. 服务实例配置(跨集群)5. …

网络爬虫技术如何影响网络安全的

随着网络的发展和网络爬虫技术的普及,一些人收集某些需要的信息,会使用网络爬虫进行数据抓取。网络爬虫一方面会消耗网络系统的网络资源,同时可能会造成核心数据被窃取,因此对企业来讲如何反爬虫显得非常重要。 一、什么是网络爬…

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线(CAN_H、CAN_L),线路少,无需共地差分信号通信(相对的是单端信号)&#…

重新理解tech lead角色

角色: tech leadleaderdeveloperarchitectleader:balance priorities,communicate clear goals,make apt decisions(做出适当的决定);supervise team members(管理团队成员),delegate tasks, issue feedback, evaluate risks, and resolve co…

深耕C/C++,解锁CV技术深度的钥匙

在21世纪的科技浪潮中,计算机视觉作为人工智能领域的一个重要分支,正以前所未有的速度推动着社会进步和产业升级。从智能手机的面部识别到自动驾驶汽车的路径规划,从医疗影像的精准分析到工业生产的自动化检测,计算机视觉算法的应…

AI新玩法:Flux.1图像生成结合内网穿透远程生图的解决方案

文章目录 前言1. 本地部署ComfyUI2. 下载 Flux.1 模型3. 下载CLIP模型4. 下载 VAE 模型5. 演示文生图6. 公网使用 Flux.1 大模型6.1 创建远程连接公网地址 7. 固定远程访问公网地址 前言 在这个AI技术日新月异的时代,图像生成模型已经成为了创意工作者和开发者手中…

嵌入式硬件篇---PID控制

文章目录 前言第一部分:连续PID1.比例(Proportional,P)控制2.积分(Integral,I)控制3.微分(Derivative,D)控制4.PID的工作原理5..实质6.分析7.各种PID控制器P控…