职责链模式(Chain of Responsibility Pattern)

【DesignModel】职责链模式(Chain of Responsibility Pattern) 基本介绍职责链模式(Chain of Responsibility Pattern), 又叫 责任链模式,为请求创建了一个接收者对象的链(简单示意图)。这种模式对请求的发送者和接收者进行解耦。职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。这种类型的设计模式属于行为型模式。... 阅读详情

学校OA系统的采购审批项目:

 需求是

  1.采购员采购教学器材

  2.如果金额小于等于5000,由教学主任审批

  3.如果金额小于等于10000,由院长审批

  4.如果金额小于等于 30000, 由副校长审批

  5.如果金额超过30000,由校长审批

 

传统方案:

 碰到金额,根据数目调用相对应的采购员

传统方案解决 OA 系统审批问题分析

 1.传统方式是 :接收到一 个采购请求后,根据采购金额来调用对应的 Approver ( 审批人 完成审批)。

 2.传统方式的问题分析 : 客户端这里会使用到分支判断(比如switch) 来对不同的采购请求处理, 这样就存在如下问题 (1) 如果各个级别的人员审批金额发生变化,在客户端的也需要变化 (2) 客户端必须明确的知道 有多少个审批级别和访问

 3)这样对一个采购请求进行处理和Approver ( 审批人 ) 就存在强耦合关系,不利于代码的扩展和维护

 

职责链模式

 职责链模式( Chain of Responsibility Pattern ),又叫 责任链模式,为请求创建了一个接收者对象的链简单示意图 。 这种模式对请求的发送者和接收者进行解耦 。

 职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推

 

责任链模式结构

在这里插入图片描述

1.处理者 (Handler) 声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。

2.基础处理者(Base Handler) 是一个可选的类, 你可以将所有处理者共用的样本代码放置在其中。

 通常情况下, 该类中定义了一个保存对于下个处理者引用的成员变量。 客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。 该类还可以实现默认的处理行为: 确定下个处理者存在后再将请求传递给它。

3.具体处理者 (Concrete Handlers) 包含处理请求的实际代码。 每个处理者接收到请求后, 都必须决定是否进行处理, 以及是否沿着链传递请求。

处理者通常是独立且不可变的, 需要通过构造函数一次性地获得所有必要地数据。

4.客户端(Client) 可根据程序逻辑一次性或者动态地生成链。 值得注意的是, 请求可发送给链上的任意一个处理者, 而非必须是第一个处理者。

 

责任链模式适合应用场景

 1.当程序需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时, 可以使用责任链模式。

 2.当必须按顺序执行多个处理者时, 可以使用该模式。

 3.如果所需处理者及其顺序必须在运行时进行改变, 可以使用责任链模式。

 

实现方式

  1. 声明处理者接口并描述请求处理方法的签名。

    确定客户端如何将请求数据传递给方法。 最灵活的方式是将请求转换为对象, 然后将其以参数的形式传递给处理函数。

  2. 为了在具体处理者中消除重复的样本代码, 你可以根据处理者接口创建抽象处理者基类。

    该类需要有一个成员变量来存储指向链上下个处理者的引用。 你可以将其设置为不可变类。 但如果你打算在运行时对链进行改变, 则需要定义一个设定方法来修改引用成员变量的值。

    为了使用方便, 你还可以实现处理方法的默认行为。 如果还有剩余对象, 该方法会将请求传递给下个对象。 具体处理者还能够通过调用父对象的方法来使用这一行为。

  3. 依次创建具体处理者子类并实现其处理方法。 每个处理者在接收到请求后都必须做出两个决定:

    • 是否自行处理这个请求。
    • 是否将该请求沿着链进行传递。
  4. 客户端可以自行组装链, 或者从其他对象处获得预先组装好的链。 在后一种情况下, 你必须实现工厂类以根据配置或环境设置来创建链。

  5. 客户端可以触发链中的任意处理者, 而不仅仅是第一个。 请求将通过链进行传递, 直至某个处理者拒绝继续传递, 或者请求到达链尾。

  6. 由于链的动态性, 客户端需要准备好处理以下情况:

    • 链中可能只有单个链接。
    • 部分请求可能无法到达链尾。
    • 其他请求可能直到链尾都未被处理。

 

责任链模式优缺点

 优点:

  ✔️ 你可以控制请求处理的顺序。

  ✔️ 单一职责原则。 你可对发起操作和执行操作的类进行解耦。

  ✔️ 开闭原则。 你可以在不更改现有代码的情况下在程序中新增处理者。

 缺点:

  ❌ 部分请求可能未被处理。
 

解决OA 系统审批

在这里插入图片描述

代码:

//请求类
public class PurchaseRequest {
     private int type = 0; //请求类型
     private float price = 0.0F; // 请求金额
     private int id = 0;

     public PurchaseRequest(int type, float price, int id) {
         this.type = type;
         this.price = price;
         this.id = id;
     }

     public int getType() {
         return type;
     }

     public float getPrice() {
         return price;
     }

     public int getId() {
         return id;
     }
}
//处理者
public abstract class Approver {

    Approver approver; //标志 下一个处理者
    String name; //名字

     public Approver(String name){
         this.name = name;
     }

     //下一个处理者
     public void setApprover(Approver approver) {
         this.approver = approver;
     }

     //处理审批的请求方法
     public abstract void processRequest(PurchaseRequest purchaseRequest);
}

//教导主任
public class DepartmentApprover extends Approver {

    public DepartmentApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice()<= 5000){
            System.out.println("请求编号:"+purchaseRequest.getId()+"被" +this.name+"处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}

//院长
public class CollegeApprover extends Approver{
    public CollegeApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <=10000){
            System.out.println("请求编号:"+purchaseRequest.getId()+"被" +this.name+"处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}

//副校长
public class ViceSchoolMasterApprover extends Approver {

    public ViceSchoolMasterApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() > 10000 && purchaseRequest.getPrice() <= 30000){
            System.out.println("请求编号:"+purchaseRequest.getId()+"被" +this.name+"处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}

//校长
public class SchoolMasterApprover extends Approver {

    public SchoolMasterApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() > 30000){
            System.out.println("请求编号:"+purchaseRequest.getId()+"被" +this.name+"处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}
public class Client {
    public static void main(String[] args) {
        //创建一个请求 类型-1  金额-31523 id-1
        PurchaseRequest request = new PurchaseRequest(1,31523,1);

        //相关审批人
        DepartmentApprover departmentApprover = new DepartmentApprover("李主任");
        CollegeApprover collegeApprover = new CollegeApprover("田院长");
        ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("陈副校");
        SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("林校长");

        //将各个审批级别设置好[设置成环形]
        departmentApprover.setApprover(collegeApprover);
        collegeApprover.setApprover(viceSchoolMasterApprover);
        viceSchoolMasterApprover.setApprover(schoolMasterApprover);
        schoolMasterApprover.setApprover(departmentApprover);

        //进行审批
        departmentApprover.processRequest(request);

        PurchaseRequest request1 = new PurchaseRequest(3,6000,2);
        viceSchoolMasterApprover.processRequest(request1);
    }
}

​
 
注意细节:

 1.将请求和处理分开,实现解耦,提高系统的灵活性

 2.简化了对象,使对象不需要知道链的结构

 3.性能会受到影响,特别是在链比较长的时候,因此需控制链中最大节点数量,一般通过在 Handler 中设置一个最大节点数量,在 setNext() 方法中判断是否已经超过阀值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能

 4.调试不方便。采用了类似递归的方式,调试时逻辑可能比较复杂

 5.最佳应用场景 有多个对象可以处理同一个请求时,比如:多级请求、请假加薪等审批流程、 Java Web 中 Tomcat 对 Encoding 的处理、拦截器

从STM32转战STC32G?逐飞开源库帮你快速上手GPIO、PWM与ADC(避坑指南) 本文详细介绍了从STM32迁移到STC32G32K128的开发实践,重点解析了GPIO、PWM和ADC等基础外设的设计差异,并提供了基于逐飞开源库的高效应用方案。通过对比两种平台的开发工具和操作方式,帮助开发者快速上手STC32G,避免常见陷阱,提升开发效率。 阅读详情

相关推荐

鸿蒙实战开发教程-注册登录页面

在密码输入框中,只要设置TextInput的类型就可以实现带眼睛logo的密码输入框效果:

2401_82546228的博客 3559

设计模式之责任链模式(Chain Of Responsibility)

4)职责链模式常被用在框架开发中,用来实现框架的过滤器、拦截器功能,让框架的使用者在不修改源码的情况下,添加新的过滤拦截功能。3)客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不。1)抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和。处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。并且每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象。5)责任分担,每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成,

liang8999的博客 3644

银河麒麟v10-arm版离线安装Portainer

银河麒麟v10-arm版离线安装Portainer

q_hsolucky的博客 3051

设计模式-责任链模式(Chain of Responsibility)

责任链模式是一种面向对象设计模式,该模式中包含了一系列处理对象和命令对象。每个处理对象都有能力决定自己可以处理哪些命令对象,如果遇到无法处理的命令对象,它会将请求传递给下一个处理对象。这种模式的核心在于避免请求发送者与接收者之间的紧密耦合,让多个对象都有可能接收请求,并将这些对象连接成一条链,沿着这条链传递请求,直到有对象处理它为止。以公司员工请假为例,员工的请假请求可能有多个领导可以批准,但每个领导的批准权限不同。员工需要根据自己要请假的天数去找对应的领导签名。这就是责任链模式的一个生动实例。

miaoyl的博客 1万+

避开这些坑!Kaggle数据集下载常见问题及解决方案(含Header Editor插件配置)

本文针对Kaggle数据集下载过程中的常见难题,提供了系统性的解决方案。重点解决了验证码无法显示、API安装失败、密钥文件配置错误及下载命令执行问题,并详细介绍了使用Header Editor插件配置请求头以绕过验证码障碍的实战方法,帮助用户高效获取数据。

weixin_29043895的博客 301

华为eNSP Pro实战:NE/CE设备SSH远程配置避坑指南

本文针对华为eNSP Pro用户在模拟多台NE路由器或CE交换机时遇到的浏览器卡顿问题,提供了详细的SSH远程配置避坑指南。通过对比浏览器与SSH客户端的资源占用和操作体验,文章详细阐述了为NE和CE设备配置SSH服务的关键步骤、命令差异及常见错误排查方法,旨在帮助用户提升实验效率,实现稳定高效的远程管理。

weixin_29196891的博客 223

【设计模式】责任链模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

一、责任链模式简介、 二、责任链模式相关设计模式、 三、责任链模式 代码示例、 1、用户账户类、 2、校验器父类、 3、用户名校验器、 4、密码校验器、 5、电话号码校验器、 6、运行测试、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 8590

从HCI层浅析LE Audio通话建立流程

本文分析了BLE AUDIO通话协议建立的全过程。当手机来电时,系统会通过CCP EATT链路通知耳机准备通话,并断开原有音乐CIS连接。随后建立通话专用的CIG组,其参数设置(如MAX SDU SIZE=80、RTN=2)与音乐场景明显不同,更注重通话的实时性。文中详细描述了设置ISO数据路径、启用ASE、建立CIS连接等关键步骤,特别指出通话采用Conversational音频上下文类型。最后解析了ISO数据包参数含义,展示了10ms周期、32kHz采样率等通话特性参数。整个过程体现了BLE AUDIO

十多年蓝牙协议软件开发,擅长蓝牙协议分析 1860

设计模式——责任链

OA系统的采购审批项目、职责链模式基本介绍、职责链模式解决 OA 系统采购审批项目

种一棵树最好的时间是十年前,其次是现在 3802

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

智能车图像处理1-基础图像规格

从厂家摄像头的库函数中,我们可以直接得到完整图像的灰度数组,经过二值化之后(算力允许,可以考虑大津法),就是我们要处理的0-1二值图像了。本系列所有的文章中,我们的图像规格如下。

taiyuezyh的博客 4340

行为型设计模式——责任链模式

责任链模式(Chain of responsibility pattern): 通过责任链模式, 你可以为某个请求创建一个对象链. 每个对象依序检查此请求并对其进行处理或者将它传给链中的下一个对象。

庄小焱 3250

国科大学习资料--人工智能原理与算法-2020年期末考试题解析(学长整理)

国科大学习资料–人工智能原理与算法-2020年期末考试题解析 张文生老师主讲 试卷共有6道题,题目不难,希望大家能取得好的成绩。 3.9 传教士和野人问题。三个传教士和三个野人在河的一岸,有一条能载一个人或者两个人的船。请设法使所有人都渡到河的另一岸,要求在任何地方野人数都不能多于传教士的人数。这个问题在AI领域中很有名,是因为它是第一个从分析的观点探讨问题形式化的论文的主题(Amarel,1968)。 a. 请对该问题进行详细形式化,只描述确保该问题求解所必需的特性。画出完整的状态空间图。 b. 应用合适

无名何许人的博客 4788

职责链模式-Chain of Responsibility Pattern

目录 模式的定义与特点 模式的结构与实现 模式的应用实例 模式的应用场景 模式的扩展 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难...

心猿意碼 5737

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

职责链模式(Chain of Responsibility Pattern)

职责链模式(Chain Of Responsibility Pattern):避免将一个请求的发送者和接收者耦合在一起,让多个对象都有机会处理请求,将接受请求的对象连接成一条链,并且沿着链传递请求,知道有一个对象能狗处理它为止 职责链模式的结构 Handler(抽象处理者):它定义一个处理请求的接口,由于不同的具体处理者处理请求不同,因此在处理者中定义一个处理请求的方法,每个处理者...

mango_love的专栏 805

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JAVA设计模式之 职责链模式【Chain of Responsibility Pattern】

一、概述     避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。     核心在于引入一个抽象处理者类 二、适用场景     请求的链式处理,多个对象可以处理同一请求、但是具体由哪个对象来处理由运行时系统根据条件判断确定。     如请假业务场景:

小吕丶Code阶区 4088

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

设计模式之职责链模式(Chain of Responsibility Pattern)

设计模式之职责链模式(Chain of Responsibility Pattern)

weixin_40261082的博客 1482

【设计模式】——职责链模式(Chain of Responsibility Pattern)

职责链模式(Chain of Responsibility Pattern)是其中一种重要的行为型设计模式,它允许你将请求沿着处理者链进行传递,直到其中一个处理者能够处理它为止。这种模式的主要优点在于解耦请求的发送者和接收者,使系统更加灵活和可扩展。

J^T的博客 1723

23种设计模式之职责链模式(Chain of Responsibility Pattern)

本篇文章将23种设计模式中的访问者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 1万+

设计模式——职责链模式(Chain of Responsibility Pattern)

● ConcreteHandler(具体处理者):它是抽象处理者的子类,可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理类中通过对请求进行判断可以做出相应的处理。(1) 职责链模式使得一个对象无须知道是其他哪一个对象处理其请求,对象仅需知道该请求会被处理即可,接收者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,由客户端负责链的创建,降低了系统的耦合度。

ddm 964

C++设计模式——职责链模式( Chain of Responsibility Pattern)

C++设计模式——职责链模式( Chain of Responsibility Pattern) 目录 文章目录C++设计模式——职责链模式( Chain of Responsibility Pattern)目录定义代码示例总结参考资料 定义 Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the recei

leonardohaig的博客 2003

责任链模式(职责链模式)(Chain of Responsibility Pattern)

学校OA 系统的采购审批项目:需求是 采购员采购教学器材 如果金额小于等于5000, 由教学主任审批(0<=x<=5000) 如果金额小于等于10000, 由院长审批(5000<x<=10000) 如果金额小于等于30000, 由副校长审批(10000<x<=30000) 如果金额超过30000 以上,有校长审批( 30000<x) 请设计程序完成采购审批项目 传统方案解决OA 系统审批,传统的设计方案(类图) 传统方案解决OA 系统审批问题分

笔记别偷看 963
上一篇: 策略模式(Strategy Pattern)
下一篇: JVM的学习
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值