设计模式之责任链模式(职责链模式)

设计模式之责任链模式(职责链模式)前言在现实生活中 一个事件需要经过多个对象处理是很常见的场景 例如 采购审批流程 请假流程等 公司员工请假 可批假的领导有部门负责人 副总经理 总经理等 但每个领导能批准的天数不同 员工必须根据需要请假的天数去找不同的领导签名 也就是说员工必须记住每个领导的姓名 电话和地址等信息 这无疑增加了难度 在计算机软硬件中也有相关例子 如总线网中数据报传送 每台计算机根据目标地址是否同自己的地址相同来决定是否接收 还有异常处理中 处理程序根据异常的类型决定自己是否处理该异常 还有 Struts2 的拦截器 J

前言

在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。

在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的地址相同来决定是否接收;还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常;还有 Struts2的拦截器、JSP和 Servlet 的 Filter 等,所有这些,都可以考虑使用责任链模式来实现。

介绍

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

意图避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

关键代码Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

应用实例 1、红楼梦中的”击鼓传花”。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

使用场景 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。

注意事项在 JAVA WEB 中遇到很多应用。

优点

  1. 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
  2. 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
  3. 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
  4. 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  5. 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

 主要缺点

  1. 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  2. 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  3. 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

模式的结构与实现

职责链模式主要包含以下角色。

  1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  3. 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应当理解其模式,而不是其具体实现。责任链模式的独到之处是将其节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动起来。

设计模式之责任链模式(职责链模式)

 

模式的实现

职责链模式的实现代码如下:

public class ChainOfResponsibilityPattern { public static void main(String[] args) { //组装责任链 Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); handler1.setNext(handler2); //提交请求 handler1.handleRequest("two"); } } //抽象处理者角色 abstract class Handler { private Handler next; public void setNext(Handler next) { this.next = next; } public Handler getNext() { return next; } //处理请求的方法 public abstract void handleRequest(String request); } //具体处理者角色1 class ConcreteHandler1 extends Handler { public void handleRequest(String request) { if (request.equals("one")) { System.out.println("具体处理者1负责处理该请求!"); } else { if (getNext() != null) { getNext().handleRequest(request); } else { System.out.println("没有人处理该请求!"); } } } } //具体处理者角色2 class ConcreteHandler2 extends Handler { public void handleRequest(String request) { if (request.equals("two")) { System.out.println("具体处理者2负责处理该请求!"); } else { if (getNext() != null) { getNext().handleRequest(request); } else { System.out.println("没有人处理该请求!"); } } } } /* 程序运行结果如下: 具体处理者2负责处理该请求! */ /* 在上面代码中,我们把消息硬编码为 String 类型,而在真实业务中,消息是具备多样性的,可以是 int、String 或者自定义类型。因此,在上面代码的基础上,可以对消息类型进行抽象 Request,增强了消息的兼容性。*/

总结

我们常用的六个设计模式就讲完了,可能有写的不好的地方,希望大家多多包涵,也希望能对大家有一定的帮助。

设计模式之责任链模式(职责链模式)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215729.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午1:34
下一篇 2026年3月18日 下午1:35


相关推荐

  • 设计模式七大原则——迪米特原则

    设计模式七大原则——迪米特原则1 什么是迪米特原则 一个对象应该对其他对象保持最少的了解 类与类关系越密切 耦合度越大 迪米特法则 DemeterPrinc 又叫最少知道原则 即一个类对自己依赖的类知道的越少越好 也就是说 对于被依赖的类不管多么复杂 都尽量将逻辑封装在类的内部 对外除了提供的 public 方法 不对外泄露任何信息 迪米特法则还有个更简单的定义 只与直接的朋友通信 直接的朋友 每个对象都会与其他对象有耦合关系 只要两个对象之间有耦合关系 我们就说这两个对象之间是朋友关系 耦合的方式很多 依赖

    2026年3月19日
    3
  • Java Dao设计模式

    Java Dao设计模式

    2021年6月17日
    94
  • 设计模式总结

    设计模式总结

    2021年12月9日
    52
  • 设计模式之策略模式_策略模式和状态模式

    设计模式之策略模式_策略模式和状态模式概述在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改

    2022年8月16日
    17
  • JAVA设计模式初探之组合模式

    先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。”   就拿剪发办卡的事情来分析一下吧。   首先,一张卡可以在总部,分店,加盟店使用,那么总部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,这个属性结构的店面层级关系就明确啦。   那么,总店刷卡消费与分店刷卡消费是一样的道理,那么总店与分店对会员卡的使用

    2022年3月11日
    39
  • 设计模式学习之策略模式

    设计模式学习之策略模式写代码时总会出很多的 if else 或者 case 如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃肿 维护的成本也会加大 而策略模式就能较好的解决这个问题 本篇博客就带你详细了解策略模式 策略模式的定义和使用场景定义 策略模式定义了一系列的算法 并将每一个算法封装起来 而且使他们可以相互替换 让算法独立于使用它的客户而独立变化 分析下定义 策略模式定义和封装了一系列的算法 它们是可以相互替

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号