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

一、什么是职责链模式

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

二、为啥使用职责链模式

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

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

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

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

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

三、职责链模式示例

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

  1. 定义分包行为

    java 复制代码
    public abstract class Contractor {
        protected Contractor nextContractor;
    
        public void setNextContractor(Contractor nextContractor) {
            this.nextContractor = nextContractor;
        }
    
        public abstract void handleTask(String task,double amount);
    }
  2. 具体的分包商

    java 复制代码
    public class GeneralContractor extends Contractor {
        @Override
        public 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 {
        @Override
        public 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 {
        @Override
        public 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 {
        @Override
        public void handleTask(String task, double amount) {
            System.out.println("三级分包商: " + task + ", Amount: " + amount);
            // 三级分包商不再扣除费用,直接完成任务
            System.out.println("最终项目价格: " + amount);
        }
    }
  3. 分包场景

    java 复制代码
    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
相关推荐
geovindu17 小时前
rust:Builder Pattern
开发语言·设计模式·rust·建造者模式
小王师傅6618 小时前
【设计模式】装饰模式(三):从装饰模式看 Java 与面向对象设计(原理篇)
设计模式
Zane199421 小时前
从一次支付渠道扩展需求,看懂"多用组合少用继承"到底在说什么
设计模式
geovindu1 天前
CSharp:Condition Variable Pattern
后端·设计模式·c#·.net·.netcore·条件变量模式·同步型模式
geovindu1 天前
sql: Data Modeling Patterns using mysql
sql·mysql·设计模式·数据库开发
sarasuki2 天前
失败重试:Agent 中指数退避的正确姿势
人工智能·设计模式·agent
Zane19942 天前
为什么你写的 Java 代码"看着面向对象、实际是面向过程"?
设计模式
geovindu2 天前
sql: Data Modeling Patterns
数据库·sql·设计模式·sqlserver
Lucis__3 天前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc
cpp_learners4 天前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
开发语言·c++·责任链模式