文章目录

  • Chain of Responsibility模式
    • 应用场景
    • 本质
    • 优点
    • 缺点
    • 角色
    • Chain of Responsibility模式的类图
    • 示例程序
      • 示例程序的类图
      • 示例代码
    • 拓展思路
    • 相关设计模式
    • 满足的原则

Chain of Responsibility模式

应用场景

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

责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。

本质

  • 分离职责,动态组合

优点

  • 请求者和接收者松散耦合
  • 动态组合职责

缺点

  • 产生很多细粒度对象
  • 不一定能被处理
    需要提供默认处理

角色

  • 抽象处理者(Handler)角色
    定义出一个处理请求的接口。 如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色 通常由一个抽象类或接口实现。
  • 具体处理者(ConcreteHandler)角色
    具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。
    由于具体处理者持有对下家的引用,因此,如果需要, 具体处理者可以访问下家。

Chain of Responsibility模式的类图

示例程序

示例程序的类图

示例代码

public class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor=successor;}public void HandleRequest(int request) {}
}
public class ConcreteHandler1 extends Handler {public void HandleRequest(int request) {if (request >= 0 && request < 10) {System.out.println("ConcreteHandler1 处理了请求" + request);} else if (successor != null) {successor.HandleRequest(request);}}
}
public class ConcreteHandler2 extends Handler {public void HandleRequest(int request) {if (request >= 10 && request < 20) {System.out.println("ConcreteHandler2 处理了请求" + request);} else if (successor != null) {successor.HandleRequest(request);}}
}
public class ConcreteHandler3 extends Handler {public void HandleRequest(int request) {if (request >= 20 && request < 30) {System.out.println("ConcreteHandler3 处理了请求" + request);} else if (successor != null) {successor.HandleRequest(request);}}
}
public class Main {public static void main(String[] args) {Handler h1 = new ConcreteHandler1();Handler h2 = new ConcreteHandler2();Handler h3 = new ConcreteHandler3();h1.setSuccessor(h3);h3.setSuccessor(h2);int[] requests = {1, 2, 3, 11, 12, 13, 21, 22, 23, 99};for (int request : requests) {h1.HandleRequest(request);}}
}

拓展思路

  • 弱化了发出请求的人和处理请求的人之间的关系
  • 可以动态的改变职责链。
  • 在一定程度上会导致处理延迟。

相关设计模式

  • Composite模式
    Handler角色经常会使用Composite模式。
  • Command模式
    有时会使用Command模式向Handler角色发送请求。

满足的原则

  • 开放封闭原则

推卸责任的 Chain of Responsibility模式相关推荐

  1. 设计模式学习笔记——责任链(Chain of Responsibility)模式

    设计模式学习笔记--责任链(Chain of Responsibility)模式 @(设计模式)[设计模式, 责任链模式, chain of responsibility] 设计模式学习笔记责任链Ch ...

  2. Chain of Responsibility 模式-----推卸责任模式

    >> ----- 当外部请求程序进行某个处理,但程序暂时无法直接决定由哪个对象负责处理时,就需要推卸责任. 在这种情况下,我们可以考虑将多个对象组成一条职责链,然后按照它们的职责链上的顺序 ...

  3. 职责链( Chain of Responsibility)模式

    职责链( Chain of Responsibility)模式 职责链模式动机(Motivation) ➢在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指 ...

  4. 责任链模式(Chain of Responsibility模式)

    在现实生活中,一个事件需要经过多个对象处理是很常见的场景.例如,采购审批流程.请假流程等.公司员工请假,可批假的领导有部门负责人.副总经理.总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的 ...

  5. 行为模式之Chain of Responsibility模式

    1.意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2.适用性 在以下条件下使用Responsi ...

  6. java使命召唤_Java设计模式之从[使命召唤等游戏的任务提示]分析职责链(Chain Of Responsibility)模式...

    我们在使命召唤.暗黑破坏神等游戏时,总会接到各种各样的游戏任务,如到某某地方解救某人,或者消灭某某地方的敌人等.当玩家进入到某一个地图(以下称之为游戏场景)时,我们就可以查看它的任务提示.在这个机制下 ...

  7. Chain of Responsibility模式——读书笔记

    继承如下抽象类的一系列类 abstract class Handler { protected Handler next; Handler(Handler next) { this.next = ne ...

  8. Chain of Responsibility (责任链)模式

    (一段时间没更新了,坚持了100天考研^^) 14.1 Chain of Responsibility (责任链)模式   "推卸责任" 有贬义的意思,但是有时候也需要 " ...

  9. 设计模式之略见一斑(Chain of Responsibility责任链模式)

    设计模式 写道 面向对象开发人员通常希望明确和减少对象间的责任,从而降低对象之间的耦合程序.这样我们的系统更加容易修改,同时也可降低产生缺陷的风险.从某种程度上说,java语言本身能够帮助降低对象间的 ...

最新文章

  1. Windows IIS7 下安装配置 PHP7.0
  2. SWIG:SWIG的简介、安装、使用方法之详细攻略
  3. boost::math模块使用 Brent 方法求函数最小值的示例
  4. boost::contract模块没有宏实现base types的测试程序
  5. Open XML应用安全(2)OLE机制
  6. 想写Python爬虫?看这5个教程就行了!
  7. HDU - 1160 FatMouse's Speed(最长不下降子序列)
  8. 董明珠上榜中国杰出商界女性100
  9. mysqldump对mysql数据库的影响
  10. python3的spyder安装,python中spyder怎么安装
  11. 图像分类以及经典的分类模型
  12. Loser,除了努力你还会什么?
  13. 考研政治---马克思主义基本原理概论---绪论
  14. 大韩航空如何成为一流航空——等级文化与称呼的改变
  15. 开课吧java广告,开课吧Java面试题:虚引用与软引用和弱引用的区别
  16. python名片识别_基于Python的名片识别接口调用代码实例
  17. vlog 12110错误及解决
  18. 已配置好环境,在CMD中输入adb命令,还是提示“‘adb‘ 不是内部或外部命令,也不是可运行程序或批处理文件”的解决方法
  19. SAS:字符串常用函数简介
  20. 关于大数据技术的演讲_2020年大数据技术应用趋势与当前大数据技术实践反思...

热门文章

  1. 华为业绩继续逆势增长,给员工分红400亿
  2. bugku 不好用的CE WriteUp
  3. 飞书二开系列之创建测试企业与企业应用等准备工作(一)
  4. 图神经网络(GNN)的必读文章
  5. Windows XP 安装 MTP 驱动
  6. qq邮箱服务器接收和发送文件夹,将QQ邮箱打造成为你的邮箱总管-qq邮箱怎么发送文件夹...
  7. 10_SkyWalking
  8. 南加大的计算机科学与工程,南加州大学优势专业及优势专业排名(QS世界排名)...
  9. 企业为什么要先上ERP?
  10. 新买的笔记本如何安装计算机,新电脑买回来要怎么做【经验分享】