设计模式-23职责链模式

麒麟V10 ARM环境离线部署MySQL:从依赖缺失到服务自启的完整避坑指南 本文详细介绍了在麒麟V10 ARM环境下离线部署MySQL的完整流程,包括依赖缺失解决方案、目录配置、服务自启设置及性能调优。特别针对国产操作系统和ARM架构的兼容性问题,提供了实用的避坑指南和优化建议,帮助用户高效完成MySQL部署与维护。 阅读详情
基本介绍:
  • 职责链模式,又叫责任链模式,为请求创建一个接收对象的链,这种模式对请求发送者和接收者进行解耦
  • 职责链模式通常每个接受者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依次类推
  • 职责链模式属于行为模式
原理类图:

在这里插入图片描述

角色说明:
  • Handler:抽象的处理者,定义了一个处理请求的接口,同时含有另外Handler
  • ConcreteHandlerA,B:具体的处理者,处理他自己负责的请求,可以访问它的后继者即后一个处理者,如果可以处理当前请求,则处理,否则就将该请求交给后继者处理,从而形成一个职责链
  • Request:含有很多属性,表示一个请求
实例:

完成学校OA系统的采购商品项目,需求采购员采购学校器材

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

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

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

如果金额大于30000,由校长审批
在这里插入图片描述

public abstract class Approver {
    Approver approver;

    String name;

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

    public void setApprover(Approver approver) {
        this.approver = approver;
    }
    abstract void proccess(PurchaseRequest purchaseRequest);
}

public class DepartmentApprover extends Approver {

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

    @Override
    void proccess(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() <=5000){
            System.out.println("教导主任处理了。。");
        }else {
            approver.proccess(purchaseRequest);
        }

    }
}

public class CollegeApprover extends Approver {

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

    @Override
    void proccess(PurchaseRequest purchaseRequest) {
        if (5000 < purchaseRequest.getPrice() && purchaseRequest.getPrice() <= 10000) {
            System.out.println("被院长处理了。。");
        } else {
            approver.proccess(purchaseRequest);
        }

    }
}

public class ViceSchoolMasterApprover extends Approver {

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

    @Override
    void proccess(PurchaseRequest purchaseRequest) {
        if (10000 < purchaseRequest.getPrice() && purchaseRequest.getPrice() <= 30000) {
            System.out.println("被副校长处理了。。");
        } else {
            approver.proccess(purchaseRequest);
        }

    }
}

public class SchoolMasterApprover extends Approver {

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

    @Override
    void proccess(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() > 30000) {
            System.out.println("被校长处理了。。");
        } else {
            approver.proccess(purchaseRequest);
        }

    }
}

public class PurchaseRequest {

    private int type = 0;
    private int id = 0;
    private float price = 0.0f;

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

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }
}

public class Client {
    public static void main(String[] args) {
        PurchaseRequest purchaseRequest = new PurchaseRequest(1, 1,1010.0f);

        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.proccess(purchaseRequest);
    }
}

职责链在Springmvc中的使用:

当请求进来时,先进入DispatcherServlet,调用HandlerInterceptor.perHandler,然后调用postHandler方法

,再调用afterCompletion方法

  • spring mvc请求的流程图中,执行了拦截器相关方法,interceptor.preHandler等等
  • 在处理spring mvc请求时,使用到职责链模式还使用到了适配器模式
  • handlerExecutionChain,主要负责的是请求拦截器的执行和请求处理,但是它本身不处理请求,只是将请求分配给链上注册的处理器执行,这是责任链实现方式,减少职责链本身与处理逻辑之间的耦合,规范了处理流程
  • HandlerExecutionChain维护了HandlerInterceptor的集合,可以向其中注册相应的拦截器
职责链模式的注意事项和细节:
  • 将请求和处理分开,实现解耦,提高了系统的灵活性
  • 简化了对象,使对象不需要知道链的结构
  • 性能会受到影响,特别是链比较长的时候,因此需要控制链的最大节点数量,一般通过handler中设置一个最大节点数量,在setNext()方法中判断是否已经超过了阈值,超过了则不允许该链建立,避免出现超长链无意识的破坏系统性能
  • 调试不方便,采用了类似递归的方式,调试时逻辑可能比较复杂
  • 最佳使用场景:有多个对象可以处理同一个请求时,比如:多级请求、审批流程、拦截器、java web中tomcat对Encoding的处理

总结:

  • 设计模式是编程中有意或者无意使用到的,并且同一种设计模式也不是100%的一样,设计模式主要是提高程序的扩展性、可读性、可维护性、规范性
  • 设计模式是可以结合使用,源码中可能部分使用到了A模式,也有可能部分使用到了B模式
  • 设计模式主要是一种编程思想,既然是思想具体实现方式就不会完全相同(当然,程序的设计结构基本是一样的)
  • 学习设计模式或源码分析时,应该抓住本质,就是使用这个设计模式到底带来了什么好处,是扩展性提高了,还是更加规范了,这样才能更好的领会设计模式的精妙之处
2026年运维工程师常见面试选择题 这篇文章总结了30道Linux运维面试常见问题及解析,涵盖基础命令、系统监控、故障排查、数据库、缓存、容器编排等多个方面。主要内容包括: 基础命令使用:如df查看磁盘、free查看内存、top监控进程等 系统监控与故障排查:负载判断、端口检查、进程管理等 中间件相关:Nginx状态码、MySQL主从复制、Redis缓存问题 容器技术:Docker优势、Kubernetes作用 运维理念:高可用、监控告警、发布策略、备份容灾 工作原则:故障处理优先级、运维工程师核心能力 文章不仅提供标准答案,还解析了各命令的 阅读详情

相关推荐

Matt Pocock Skills — AI 编码代理技能包介绍与使用指南

《Matt Pocock Skills:AI编码代理技能包指南》 摘要: Matt Pocock Skills是一套开源AI编码代理技能包,旨在解决AI辅助开发中的四大痛点:需求理解偏差、token浪费、代码质量差和架构腐化。该技能包包含多种实用工具:/grill-with-docs用于需求对齐,/tdd实现测试驱动开发,/diagnose提供规范化调试流程,/triage管理issue生命周期。核心思想包括:通过拷问式对齐确保需求理解一致,建立共享领域语言提高沟通效率,快速反馈闭环加速开发,以及持续架构维

qq_45859163的博客 2219

瑞_23种设计模式_职责链模式

本文章为瑞_系列专栏之《23种设计模式》的职责链模式篇。主要是抽象处理者类 Handler 类中的submit方法,即递归+多态。通常用于实现不同的处理对象来处理一个请求,但具体由哪个对象处理则在运行时动态决定,可以有效避免使用众多的 if 或者 if···else 语句。为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 2291

《Linux运维总结:etcd 3.5.15集群数据备份与恢复》

《Linux运维总结:etcd 3.5.15集群数据备份与恢复》

东城绝神 1079

c++ 设计模式23讲之职责链模式

职责链模式 定义: 避免请求发送者与处理者耦合,将多个处理对象连成一条链,传递请求直到有一对象处理它 优点: (1)链中对象不需知道链结构,由客户端创建链 (2)请求对象只需维护后继引用,不需维持它对所有候选者引用 (3)增加请求对象无需修改源代码,只需重新创建链 缺点: (1)一个请求没有明确的接受者,可能会未被处理 (2)较长的职责链设计多个处理对象,性能会受到一定影响 (...

whish1994的博客 215

PCIE协议版--M.2接口规范V1.0中文版1——物理规格篇

5.1.3.双模块键模块:同时支持Socket1-DP、Socket1-SD。2.4.7.3.3.双面模块(使用H2.8、H3.2、H4.2连接器)6.5.8.2.5.热设计功率响应-带有风扇类别的薄平台笔记本电脑。2.3.7.1. Socket1&2射频连接器PIN-OUT。5.2.2.Socket2 PIN-OUT(机械KEY B)3.2.10.1.3.极薄的笔记本电脑的电源开关顺序的例子。5.1.1.Socket1-DP(机械KEY A)5.1.2.Socket1-SD(机械KEY E)

想你所想,做你所做 4675

Hive数据迁移

【迁移背景】 本次需要将老集群的hive数据(共30多张表)迁移至新集群中。 老集群版本为CDH5.13,未启用kerberos; 新集群版本为CDH5.14,启用了kerberos。 由于cloudera官方文档说明,在5.x的版本不支持从未启用kerberos的集群与启用了kerberos的集群之间的数据复制。因此无法通过bdr方式进行数据同步。于是采用手工方式进行测试验证。 第一步...

wangkuangood3200的专栏 469

了解23种设计模式之职责链模式

了解23种设计模式之职责链模式什么是职责链模式职责链模式结构职责链模式实现 什么是职责链模式 在现实生活中,常常会出现这样的事例: 一个请求多个对象可以处理,但每个对象的处理条件和权限不同。例如,公司员工请假,可批假的领导只有部分负责人,经理,总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度。这样的例子还有很多。 在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的

Crazy_Cw的博客 508

AUTOSAR网络管理配置详解:Vector DaVinci工具全面讲解

手把手带你用Vector DaVinci完成AUTOSAR网络管理模块的配置,涵盖NmChannel、NmPdu、重复帧抑制等关键参数设置,深入解析CAN总线上的NM报文调度与唤醒机制,助你扎实掌握AUTOSAR网络管理核心实践。

weixin_42504649的博客 168

23种设计模式——职责链模式

职责链模式本质:分离职责,动态组合

qq_51165184的博客 908

MSP430FR6043超声波传感器设计记录

1.前言 最近项目设计了一个超声波传感器 参考TI官方的板子EVM430-FR6043搭建的电路 EVM430-FR6043评估模块是一个用于评估MSP430FR6043 MCU性能的开发平台。 MSP430FR6043 MCU是一款超低功耗器件, 集成了超声波感测模拟前端 用于精确地进行超声波测量。 专为超声波水表、热量计和燃气表而设计, MSP430FR6043 器件采用低功耗加速器 (LEA), 可实现基于高速 ADC 的信号采集以及后续优化数字信号处理, 为电池供电型计量提供了一款超低功耗、高

bingdund的博客 2864

v86.01 鸿蒙内核源码分析 (静态分配篇) | 很简单的一位小朋友 | 百篇博客分析 OpenHarmony 源码

相比动态分配,静态内存池的分配就是个小弟弟,非常的简单,两个结构体 + 一张图 就能说明白。

日拱一卒,力出一孔 774

GOF23设计模式之职责链模式

责任链,沿着链传递链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。通过这种模式可以实现 请假审批 需要逐级这类的场景下使用,比if else 结构更加清晰

开心杨的个人博客 406

Jetson Nano 实战指南:深度学习环境配置与 YOLOv5 边缘端部署解析

Jetson Nano是NVIDIA推出的嵌入式AI开发板,凭借其强大的GPU计算能力和完善的软件生态系统,成为边缘AI部署的理想平台。本教程源于作者团队参加2024中国机器人大赛暨RoboCup机器人世界杯中国赛机器人先进视觉3D识别赛道的实战经验,是一份经过验证的环境部署指南。

FJN110的博客 152

设计模式(23)——职责链模式

学校OA系统的采购审批项目 采购员采购教学器材 如果金额 小于等于5000,由教学主任审批(0<=x<=5000) 如果金额 小于等于10000,由院长审批(5000<x<=10000) 如果金额 小于等于30000,由副校长审批(10000<x<=30000) 如果金额 超过30000以上,由校长审批(30000<x) 传统方案解决OA系统审批 设...

minge0001的博客 401

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

23种设计模式之职责链模式(16)

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 ...

LuckyGuyy的博客 245

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java设计模式[23]-职责链模式

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

JensenPWLee的博客 178

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

程序员必知的23种设计模式之职责链模式

文章目录1. 模式引出--OA系统采购审批需求2. 传统方案解决OA系统审批3. 传统方案解决OA系统审批问题分析4. 职责链模式基本介绍4.1 职责链模式的原理类图4.2 对原理类图的说明-即(职责链模式的角色及职责)5. 案例修改6. 职责链模式的注意事项和细节 1. 模式引出–OA系统采购审批需求 学校OA系统的采购审批项目:需求是 采购员采购教学器材 如果金额 小于等于5000, 由教学主任审批 (0<=x<=5000) 如果金额 小于等于10000, 由院长审批 (5000

ECHO的博客 474

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

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

小威的博客 1万+

23种设计模式之职责链模式

用来解决上述问题的一个合理的解决方案,就是使用职责链模式。那么什么是职责链模式呢? (1)职责链模式定义   (2)应用职责链模式来解决的思路 仔细分析上面的场景,当客户端提出一个聚餐费用的申请,后续处理这个申请的对象,项目经理、部门经理和总经理,自然的形成了一个链,从项目经理à部门经理à总经理,客户端的申请请求就在这个链中传递,直到有领导处理为止。看起来,上面的功能要求很

cxs4808的专栏 425

用Rust实现23种设计模式之 职责链模式

下面是一个简单的例子,演示如何使用 Rust 实现职责链模式。

Program with head, not hand 1668

Java23种设计模式——16.行为型模式之职责链模式

Java中除去有设计原则之外,还有23中设计模式。 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题。 并且在这些模式中,可以说是将语言的使用体现的淋漓尽致。 那我们今天要学习行为型模式中的职责链模式 ! 职责链模式 先来百度百科一下什么叫职责链模式 通过百度百科我们可以知道,职责链模式就是客户端发起一个请求,或者调用,然后对应的链上的对象开始去处理请求,而这一切都是不影响客户端的情况下动态完成组织和分配的 职责链模式的定义与...

胖子胖子大胖子的博客 1124

厚积薄发打卡Day43 : [itcast] GoF23通俗易懂的设计模式之 <职责链模式>

前言: 视频教程:黑马程序员Java设计模式详解,全网最全23种Java设计模式 什么是设计模式? 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 1995年,GoF(Gang of Four,四人组)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了23种设计模式,人称 【GoF设计模式】 设计模式分类 具体模式 创建型模式:它的主要特点是“将对象的创建与使用分离”。这样可

COOLGWAYNE_TECH_BLOG 287

浅学设计模式之职责链模式(14/23)

1. 职责链模式的概念 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这个条链传递该请求,直到有一个对象处理它为止。 在Java/Android开发中,这个模式我们并不陌生,比如Java的类加载机制,“双亲委托”模型,Android中触摸事件的传递机制,都体现了职责链模式。 以上面的模型来理解责任链模式,对于一个事件来说,它并不需要知道谁来处理它,这样就解除了事件和处理事件的对象的耦合。

RikkaTheWorld 226

设计模式——(23)职责链模式

1、定义 职责链也叫责任链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。 在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。 2、UML类图 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。 具体处理者(Concrete

DF10f-0001A 117

23种设计模式之职责链模式(Chain of Respons

再投中行的话会不会系。前言 上节介绍了java中的类,其中提到了数据类型,下面我们就来看一下java中的数据类型。数据类型 java中数据类型跟js中大部分都是一样的,分为基本数据。责任链模式概念 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过把请求的发送者和接收者解耦,将多个对象连。模板方法模式是一种行为型设计模式,它定义了一个算法骨架,将某些算法步骤的实现延迟到子类中。这样可以使得算法的框架不被修改,但是具体的实现可以根据需要进行调整。

2301_78234743的博客 98

Java 23种设计模式系列之职责链模式(常用)

目录 前言 职责链模式(也称责任链模式)Chain Of Responsibility 定义: 优点: 缺点: 关键代码 使用场景 模式的结构 结构图 模式的简单实现 实现代码 前言 在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度,所有这

weixin_51094637的博客 413
上一篇: 设计模式-22策略模式
下一篇: netty源码浅析-池化内存直接申请
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值