首页 > 其他分享 >【设计模式-行为型】职责链模式

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

时间:2025-01-22 16:27:52浏览次数:3  
标签:分包商 task 职责 nextContractor 模式 Contractor amount 设计模式 public

一、什么是职责链模式

        说到职责链模式,我头脑中想到的例子就是电影《人体蜈蚣》,不过有点血腥和恶心,所以想了想还是换一个例子形容比较好,在软件行业、建筑行业或工程项目,包工程或者包项目的项目承包大佬一个个都是责任链模式的高手,层层转包层层卡油,从总承包商开始,任务沿着层级传递,直到最终的分包商完成具体的工作。往往上千万的项目到最终分包商所剩不多。职责链模式(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 {
        @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. 分包场景
    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

标签:分包商,task,职责,nextContractor,模式,Contractor,amount,设计模式,public
From: https://blog.csdn.net/qq_36038282/article/details/145304551

相关文章

  • H3C-防火墙IPSec配置案例(主模式)
    目录1.IPSec简述:2.IPSec应用场景:3.网络拓扑及说明:4.案例背景:5.网络配置:5.1基础网络配置:5.1.1总部防火墙基础配置:5.1.2分部防火墙基础配置:5.1.3互联网路由器基础配置:5.1.4总部服务器基础配置:5.1.5总部PC基础配置:5.2IPSec配置:5.2.1总部防火墙IPSec配......
  • 【设计模式-行为型】状态模式
    一、什么是状态模式    什么是状态模式呢,这里我举一个例子来说明,在自动挡汽车中,挡位的切换是根据驾驶条件(如车速、油门踏板位置、刹车状态等)自动完成的。这种自动切换挡位的过程可以很好地用状态模式来描述。状态模式(StatePattern)是一种行为型设计模式,它允许一个对......
  • 比简单工厂更好的 - 工厂方法模式(Factory Method Pattern)
    工厂方法模式(FactoryMethodPattern)工厂方法模式(FactoryMethodPattern)工厂方法模式(FactoryMethodPattern)概述工厂方法模式(FactoryMethodPattern)结构图工厂方法模式(FactoryMethodPattern)涉及的角色talkischeap,showyoumycode总结工厂方法模式(FactoryM......
  • 9、智能驾驶域控的工作模式与启动
    针对域控制器硬件工作模式与启动需支撑L2+功能实现的要求,以下是对相关要求的概述:一、域控制器硬件工作模式要求域控制器硬件需支持下电模式、待机模式、激活模式、最小风险策略模式等,以满足自动驾驶系统在不同场景下的需求。下电模式:当车辆处于完全关闭状态时,域控制器硬件应......
  • 「全网最细 + 实战源码案例」设计模式——六大设计原则
    目的提高软件系统的可维护性和可复用性,增加软件的可拓展性和灵活性,程序员遵循6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。开闭原则(OCP)核心思想1.对拓展开放软件模块应该在不修改原有代码的情况下,通过扩展的方式增加新功能。目标:提高系统的可......
  • 「全网最细 + 实战源码案例」设计模式——单例设计模式
    核心思想:属于创建型设计模式,核心目的是确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来获取该实例。控制共享资源的访问(如数据库链接、配置管理、日志处理器等)真实世界类比:政府是单例模式的一个很好的示例。一个国家只有一个官方政府。不管组成政府的每个......
  • 策略模式和职责链模式实现坦克大战
    目录:一个实例讲完23种设计模式当前:策略模式职责链观察者上一篇《命令模式坦克大战简单实现(java实现)》需求:坦克大战创建两种坦克坦克类型射程速度b7070米时/70公里b5050米时/70公里简单说明一下:这任然用坦克大战的需求,实现了如下3种模式策略职责链观察者(这里的观察......
  • SQL进阶实战技巧:用户会话内行为模式挖掘
    目录0问题描述 1数据准备2问题分析3小结 往期精彩0问题描述分析用户在每个会话内的行为序列,找出最常见的前N种行为模式,并按用户分群。用户表结构和数据假设有名为user_behavior_log的用户行为日志表,包含以下字段:字段名数据类型描述user_idINT用户IDbehav......
  • iStore网关(旁路由)模式设置教程
    OpenWrt网关(旁路由)模式设置教程本文是在帮助小白用户快速设置OpenWrt设备(如N1)为网关(旁路由)模式。通过以下步骤,你可以在三分钟内完成设置,让设备顺利上网。Step1:登录OpenWrt系统后台通过浏览器访问OpenWrt的管理界面,通常为192.168.1.1(如未更改过)。输入用户名......
  • Golang学习笔记_28——工厂方法模式
    Golang学习笔记_25——协程Golang学习笔记_26——通道Golang学习笔记_27——单例模式文章目录工厂方法模式1.介绍2.优点3.类图4.实现源码工厂方法模式1.介绍工厂方法模式(FactoryMethod)是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实......