设计模式学习——职责链模式

设计模式学习笔记--职责链模式 一.简介 说道职责链模式可能比较陌生,但是我们在工作生活中经常会遇到职责链。比如我最近有事,要请一天的假,那么我在系统上提交一个申请。如果这个假期很短,可能直接上级就批复了。但是如果假期比较长,直接上级没有办法审批,那么这个请求就会继续向上发,转到部门领导。部门领导审批了。而如果假期再长,那么这个请求也许会再上一级。这样的一个过程就是职责链。 看一下职责连模式的定义:在责任链模式里,很多对象由 阅读详情

基本介绍

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

### 原理类图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201026233523485.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0phdmFLb2JlQnJ5YW50,size_16,color_FFFFFF,t_70#pic_center) **职责链模式(Chain Of Responsiblity)** 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 **对原理类图的说明-即(职责链模式的角色及职责)** 1. Handler:抽象的处理者,定义了一个处理请求的接口,同时含有另外一个Handler对象 2. ConcreteHandlerA,B是具体的处理者,处理它自己负责的请求,可以访问它的后继者(即下一个处理者),如果可以处理当前请求则自己处理,否则就将该请求交给下一个后继者去处理,从而形成一个职责链 3. Request,含有很多属性,表示一个请求。

职责链模式的实例类图

在这里插入图片描述

职责链模式的实例代码

//请求类
public class PurchaseRequest {

    private int type; //请求类型
    private int number;
    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 class PurchaseRequest {

    private int type; //请求类型
    private int number;
    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 class DepartmentApprover extends Approver {

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

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() <= 5000) {
            System.out.println("请求编号 id=" + 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("请求编号 id=" + 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("请求编号 id=" + 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("请求编号 id=" + purchaseRequest.getId() + " 被 " + this.name + " 处理");
        } else {
            approver.processRequest(purchaseRequest);
        }
    }
}

职责链模式在SpringMvc的源码分析

在这里插入图片描述
源码分析
在这里插入图片描述
说明

  • springmvc请求的流程图中,执行了拦截器相关方法interceptor.preHandler等等。
  • 在处理SpringMvc请求时,使用到职责链模式还使用到适配器模式
  • HandlerExecutionChain 主要负责的是请求拦截器的执行和请求处理,但是它本身不处理请求,只是将请求分配给链上注册的处理器执行,这是职责链的实现方式,减少职责链本身与处理逻辑之间的耦合,规范了处理流程
  • HandlerExecutionChain 维护了HandlerInterceptor的集合,可以向其中注册相应的拦截器。

职责链模式的注意事项和细节

  1. 将请求和处理分开,实现解耦,提高系统的灵活性
  2. 简化了对象,使对象不需要知道链的结构
  3. 性能会受到影响,特别在链比较长的时候,因此需要控制链中最大节点数量,一般通过在Handler中设置一个最大节点数量,在setNext()方法中判断是否已经超过阈值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能
  4. 调试不方便,采用了类似递归的方式,调试时逻辑可能比较复杂
  5. 最佳应用场景:有多个对象可以处理同一个请求时,比如:多级请求、请假/加薪等审批流程、java Web中Tomcat对Encoding 的处理、拦截器
《C++20设计模式》学习笔记——第13章职责链模式 职责链模式是一种非常简单的设计模式,允许组件依次处理命令(或查询)。职责链最简单的实现只需要维护一个指针链。理论上,如果想快速删除链上的对象,也可以用普通的vector或者list来代替指针链。代理链的实现则更加复杂,它利用了中介者模式和观察者模式,允许通过事件(信号)处理查询,让每个订阅者在将查询值返回给用户之前对最初传递的值(它是贯穿整个链的单个引用)进行修改。 阅读详情

相关推荐

Solidworks转URDF避坑实录:从履带机器人到ROS仿真的完整配置流程

本文详细介绍了将Solidworks履带机器人模型转换为URDF格式并配置ROS仿真的完整流程,重点解析了坐标系设置、复杂关节定义、插件配置等关键步骤中的常见问题与解决方案,帮助开发者高效实现履带机器人在RVIZ和Gazebo中的精确仿真。

weixin_30693683的博客 457

设计模式学习之职责链模式

职责链模式 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止,是一种对象行为型模式 类图 实现 抽象处理者 package design.cor.realize; /* * *@author:zzf *@time:2020-12-20 * */ public abstract class Handler { //维持对下家的引用 protected Handler succe

qq_43610675的博客 779

AlphaFold-multimer 复合物结构预测

是DeepMind开发的AlphaFold项目的一个扩展,旨在预测蛋白质多聚体的三维结构。蛋白质多聚体是由多个蛋白质亚单位相互组装而成的结构,如酶、膜蛋白复合物和病毒颗粒。理解多聚体的结构对于揭示蛋白质的功能和相互作用非常重要。

MurphyStar的博客 5647

学习设计模式《二十二》——职责链模式

职责链模式的本质是【分离职责,动态组合】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1239

【Lammps】MS将cif通过msi2lmp.exe转为data文件

在Materials Studio中打开cif文件,在Modules工具行选择Forcite>calculation>Energy中选用cvff力场,点击more,不要运行run,在more中取消勾选calculate automatically,点击calculate,然后叉掉后在file>export导出car文件,同步生成了mdf文件。对于MS中没有的立场,选择之后点calculate会报错,右键选择label,然后根据Forcite选择原子,会发现有力场的有标号,没有力场的MS没有对选择标号。

zhangguoliang624的博客 3673

【WRF数据介绍第二期】气象驱动场数据介绍及下载

【WRF数据介绍第二期】气象驱动场数据介绍及下载

WW、forever的博客 2160

学习设计模式——职责链模式

职责链模式 // 定义一个公共类 let Leader = function () { this.nextLeader = null; }; Leader.prototype.setNext = function (next) { this.nextLeader = next; return next; // 这样可以链式子调用 ...

逆水行舟,不进则退 279

使用MATLAB和Simulink来创建一个智能家居照明控制系统的仿真模型

智能家居中的智能照明控制系统旨在通过自动化手段优化家庭照明,提高能源效率和居住舒适度。这通常涉及传感器(如光敏传感器、运动传感器)、控制器(如微控制器或PLC)以及执行器(如调光器或开关)。在这个教程中,我们将使用MATLAB和Simulink来创建一个智能家居照明控制系统的仿真模型。

xiaoheshang_123的博客 220

设计模式学习-职责链模式

Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一, 该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。 要实现职责链模式,需要满足该模式的基本条件: 1、对象链的组织。需要将某任务的所有职责执行对象以链的形式加以组织。 2、消息或请求的传递。将消息或请求沿着对象链传递,...

ZeWe的博客 301

多模态论文笔记——VQ-VAE和VQ-VAE-2

本文详细介绍VQ-VAE和VQ-VAE-2的原理和训练过程,为后面的dVAE在DALLE中的使用打下坚实的基础。

haopinglianlian的博客 3299

Unreal Engine开发:角色动画与状态机_动画混合:通过混合节点实现平滑动画过渡

动画混合是提升游戏动画质量的关键技术之一。Unreal Engine提供了多种混合节点,包括BlendSpace1D、Blend Two By Bool、Blend Two By Alpha和Sequencer,每种节点适用于不同的场景。通过合理使用这些节点,可以实现平滑、自然且高效的动画过渡效果。此外,遵循最佳实践和高级应用技巧,可以进一步优化动画质量和性能。希望本节内容对你在Unreal Engine中实现动画混合有所帮助,使你的游戏角色动作更加流畅和自然。

chenlz2007的博客 1245

设计模式入门学习 职责链模式

Chain Of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。   组成:   抽象处理者:它定义了一个处理请求的接口。   具体处理者:实现抽象处理者的接口,并处理它所负责的请求,如果不能处理则请问它的后继者。   纯的职责链模式,规定一个具体处理者

omegayy的专栏 568

微观交通流仿真软件:SUMO (Simulation of Urban MObility)_(8).仿真场景创建与编辑

总结文件()包含了仿真过程中的总体统计信息,如车辆生成数、平均速度等。加载总结文件使用Python的提取关键信息通过以上步骤,可以使用SUMO及其相关工具和库创建和编辑交通仿真场景。无论是手动创建、使用工具转换现有数据,还是通过Python脚本自动生成,SUMO都提供了丰富的功能来满足不同需求。此外,Traci库允许在仿真过程中动态调整交通场景,从而实现更精细的控制和优化。最后,通过对输出文件的分析,可以评估仿真结果并进行进一步的改进。

kkchenjj的博客 1270

设计模式学习—20职责链模式

职责链模式 文章目录职责链模式UML解释说明代码实现参考资料 UML 解释说明 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 代码实现 Handler.class package learn20; public abstract class Handler { ...

Abfahrt的博客 160

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式学习笔记-职责链模式

学校的采购审批项目 如果金额小于等于5000,由教学主任审批 如果金额小于等于10000,由院长审批 如果金额小于等于30000,由副校长审批 如果金额大于30000,由校长审批 传统方案解决 传统方案的问题 传统方式解决问题是接收一个采购项目后,根据采购金额来调用对应的Approver完成审批 客户端会使用到分支判断来处理不同的采购请求,这样的话如果相关审批员可审核价格改变客户端需要重写。另外客户端需要知道每个审批员的可审核金额,存在强耦合不利于扩展 职责链模式 基本介绍 职责链模式又叫责任链

我不是什么好人 271

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

设计模式学习(一)- 职责链模式

设计模式学习(一)- 职责链模式1、职责链模式定义2、职责链UML图3、实现职责链用例3.1 用例UML图3.2 用例类3.2.1管理类3.2.2主管类3.2.3经理类3.2.4经理类3.2.5Request类3.2.6执行类 1、职责链模式定义 每一个对象都可以处理请求,但是能够处理请求的范围不一样,当下级对象无法处理请求时,转到上级对象进行处理请求。 比如请假申请,部门主管->公司经理->公司董事长,每个级别能够处理的申请范围不一样 使多个对象都有机会处理请求,从而避免请求的发起者和接收者之

qq_43479628的博客 230

c++设计模式之职责链模式 学习笔记

职责链模式,如果用程序语言来近似描述,我理解为if else结构,感觉就是一级级的判断处理。不过将其封装成类的形式没有了if else的复杂分支,而且维护的时候也方便。 举个常见的例子:因为家里有事情处理,你需要向领导请13天的假。对于你来说,可能只需要在部门办公软件上填写申请,并提交给你的部门经理就可以了。但实际审批的话,是不是部门经理直接审批呢?肯定不是的。比如公司有规定:请假0-a天的时候你...

超级无敌大泡泡的博客 293

学习设计模式——20有序车站——职责链模式

20 有序车站——职责链模式 文章目录20 有序车站——职责链模式分解需求第一站,请求模块第二站,响应数据适配模块终点站,创建组件模块站点检测,单元测试 场景:领导叫过去说实现一个表单,要有输入验证和输入提示交互体验,具体是什么类型的表单,还没确定。 这是我们面对一个"半成品"的需求,由于需求不明确,没法直接做,做了还有改,不如不做。这时我们可以应用职责链模式 分解需求 把这个任务分解为 请...

逆水行舟,不进则退 457

设计模式学习(十四):职责链模式

目录一、前言二、职责链模式三、示例介绍四、结构与参与者五、AWTK中的应用六、总结6.1 优缺点6.2 应用场景 一、前言 本周参加了第九次设计模式研讨会,主题是职责链模式,接下来我们来看看该模式的具体内容。 二、职责链模式 职责链模式:为请求创建了一个接受者对象的链。该模式给予请求的类型,对请求的发送者和接受者进行解耦。 意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 主要解决:职责链上的处理者负责处理

Rain_Mic的博客 397

职责链模式 - 设计模式学习

  职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它位置。   下面给出职责链模式的结构图:          下面给出职责链模式的基本代码结构: namespace ConsoleApplication1 { //Hand...

weixin_34206899的博客 92

设计模式学习笔记(十六)职责链模式

1、降低耦合度:将请求发送者和接收者解耦,每个对象只需关注特定的请求类型,对于其他请求可以无视。2、灵活性和扩展性:可以根据需求动态添加或修改请求处理器,使得系统更具灵活性和可扩展性。3、可维护性:职责链模式使得系统中的每个处理器只关注自己的业务逻辑,代码更加清晰、简洁,易于维护。1、性能问题:由于请求可能被多个处理者处理,因此有可能会导致性能问题。当处理者的数量过多时,可能会影响请求的处理效率。

weixin_44917291的博客 221

设计模式学习笔记(十六):职责链模式

1 概述 1.1 引言 1.2 定义 1.3 结构图 1.4 角色 2 典型实现 2.1 步骤 2.2 抽象处理者 2.3 具体处理者 3 实例 4 分类 4.1 纯的职责链模式 4.2 不纯的职责链模式 5 主要优点 6 主要缺点 7 适用场景 8 总结

氷泠 339

设计模式学习笔记之职责链模式

1.责任链模式(Chain of Responsibility Pattern)又叫责任链模式,为请求创建一个接受者对象的链,对请求发送者和接受者进行解耦。 2.责任链模式通常是每个接收者都包含另一个接受者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个对象 3.springmvc源码: SpringMVC-HandlerExecutionChain类使用到责任链模式。同时还使用到适配器模式处理请求。 HandlerExecutionChain主要负责请求拦截器的执行和...

whatwhyhaodo的博客 181
上一篇: 设计模式学习——策略模式
下一篇: 设计模式学习——设计模式概论与分类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值