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

类型:行为型模式。

概述:

职责链模式,行为型模式,说明其主要是通过行为来表现的。这里的行为,也可以理解为方法(Method)。职责链模式,将一堆处理事件的行为对象抽象为一个个的类。有些类似链表结构,每个类中都有一个指针,指向它的下一个类。这样,当一个类处理完它要处理的事情之后,就将工作将给下一个类来处理。如果下一个类发现它暂时无事可做,它依然将职责转到下一个类去处理。

职责链模式,好将每一个职责抽象成一个类。然后处理某件事,会有一系列的职责者,这样就抽象出一系列的职责。然后用指针,像链表一样,将它们链起来,就形成了职责链模式了。

一系列的职责,抽象出相同的接口,以及一个指针形成抽象类作为这一系列职责类的抽象基类。

例如,生产线的工人。每个人,针对生产产品的职责,去完成自己的职责,完成之后,就可以交给生产线上的下一位员工。有些生产线,对员工职责的顺序有要求,有些生产线没有要求。

类图:

参与者:

  1. Client,发起职责。
  2. Worker,抽象基类,提供所有其他具体工人工作的接口,另外有一个指针,指向Worker类的变量。
  3. Installer、Packer、QC,生产线上的三种工人,分别实现自己要做的工作,另外指向它的下一个职责者,如果没有,则不用指出。

示例代码:

[csharp] view plaincopy
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Design14
  5. {
  6. // 抽象接口
  7. abstract class Worker
  8. {
  9. public Worker worker;
  10. public abstract void DoHandler();
  11. }
  12. class Installer : Worker
  13. {
  14. public Installer(Worker _worker)
  15. {
  16. this.worker = _worker;
  17. }
  18. public override void DoHandler()
  19. {
  20. Console.WriteLine("完成产品的基本组装");
  21. if (null != this.worker)
  22. {
  23. this.worker.DoHandler();
  24. }
  25. }
  26. }
  27. class Packer : Worker
  28. {
  29. public Packer(Worker _worker)
  30. {
  31. this.worker = _worker;
  32. }
  33. public override void DoHandler()
  34. {
  35. Console.WriteLine("完成产品的打包");
  36. if (null != this.worker)
  37. {
  38. this.worker.DoHandler();
  39. }
  40. }
  41. }
  42. class QC : Worker
  43. {
  44. public QC(Worker _worker)
  45. {
  46. this.worker = _worker;
  47. }
  48. public override void DoHandler()
  49. {
  50. Console.WriteLine("完成产品的质检");
  51. if (null != this.worker)
  52. {
  53. this.worker.DoHandler();
  54. }
  55. }
  56. }
  57. // Client
  58. class Program
  59. {
  60. static void Main(string[] args)
  61. {
  62. // 完成职责链的构建
  63. Worker qc = new QC(null);
  64. Worker packer = new Packer(qc);
  65. Worker installer = new Installer(packer);
  66. // 开户执行职责
  67. installer.DoHandler();
  68. }
  69. }
  70. }

适用性:

  1. 对于同一请求,有多个不同的处理方式。
  1. 有多个请求,不知道哪一个请求正确。

注意:

  1. 如果是C++,抽象类一定要注意析构函数一定要是虚函数。
  2. 职责链并不一定要求是一条链条,也可以是像树一样.

优缺点:

  1. 优点,降低了请求者与响应者之间的耦合度。增强了职责的灵活性,可以不同职责组合。
  2. 缺点,当职责链比较多时,对于链的正确配置容易遗漏。

参考资料:

  1. 《设计模式——可复用面向对象软件基础》
  2. 《大话设计模式》
  3. 《Head First设计模式》

转载于:https://www.cnblogs.com/feihe0755/p/3529451.html

设计模式14——行为型模式之职责链模式相关推荐

  1. JAVA 设计模式—————— 命令模式和职责链模式

    学习 Netty 前的准备工作!! 这里,还是先来复习一下 OOP (面向对象)的七大原则: 开闭原则:对扩展开放,对修改关闭 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立. 依赖倒置原 ...

  2. JAVA设计模式之责任链模式(职责链模式)

    转自JAVA设计模式之责任链模式(职责链模式)​​​​​​​ 责任链/职责链(Chain of Responsibility)模式的定义 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理 ...

  3. Java设计模式——责任链模式(职责链模式)详解

    模式的定义与特点 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当 ...

  4. 策略模式和职责链模式在CMS中的应用

    最近在做一个轻量级CMS供客户站点使用. 根据客户的需求,需要以静态页方式提供用户浏览的页面,同时还要保留一个本份,支持"双远程"发布,即在一台远程发布服务器上保留存根,最终页面保 ...

  5. 责任链模式(职责链模式)详解——小马同学@Tian

    责任链模式(职责链模式)详解 在现实生活中,一个事件需要经过多个对象处理是很常见的场景.例如,采购审批流程.请假流程等.公司员工请假,可批假的领导有部门负责人.副总经理.总经理等,但每个领导能批准的天 ...

  6. 责任链模式(职责链模式)详解

    在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假,可批假的领导有部门负责人.副总经理.总经理等,但每个领导能批准的天数不同,员工必须根 ...

  7. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

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

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

  9. 观察者模式与职责链模式的相同和不同_GOF设计模式(策略模式,职责链模式)...

    策略模式(整体的替换算法) 基本介绍:对象具备某个行为,但是在不同的场景中,该行为有不同的实现算法.(定义一组算法,将每个算法都封装起来,并且使他们之间可以互换).多用于封装算法 类图 角色: 上下文 ...

  10. Scala特质讲解【特质继承形式、对象混入特质、特质适配器模式,模板方法模式,职责链模式、trait的构造机制、特质继承类】

    文章目录 特质 类继承单个特质 类继承多个特质 object继承特质trait 演示特质中的成员 对象混入特质 使用trait实现适配器模式 使用trait实现模板方法模式 使用trait实现职责链模 ...

最新文章

  1. Norse Attack Map网络攻击实时监测地图
  2. jquery找祖先包含_jquery如何获取祖先元素
  3. OpenCV计算时刻calculate moments的实例(附完整代码)
  4. 使用JDK自带的jmap和jhat监控处于运行状态的Java进程
  5. mysql5.7.16安装版_mysql数据库5.7.16安装版怎么安装图解
  6. VBA MultiPage 循环多页控件
  7. 创建虚拟机、安装CentOS 7
  8. 帆软条件判断是否包含指定字符串
  9. Python for Informatics 第11章 正则表达式五(译)
  10. 一个很有意思的熊猫免疫器
  11. matlab电压模块,matlab simpowersystems电路仿真模块.doc
  12. 计算并返回 x 的 算术平方根
  13. java之等差素数的求法
  14. 【office2010】利用尾注添加参考文献
  15. 十一月组队学习报名啦!
  16. Java——将汉字转为汉语拼音工具类
  17. 噩梦射手(SurvivalShooter)教程(八)
  18. Java并发Future
  19. jdk环境变量配置成功只需三步
  20. Cent OS借助YUM快速安装MySQL

热门文章

  1. 快速从小白到大牛的Python学习路线
  2. 【Loss】深度学习的多个loss如何平衡?
  3. 上海医疗救治专家组组长:没有讨价还价!
  4. 【干货】统计学思维导图
  5. 给大家送一个机械轴键盘~
  6. 教你如何用机翻软件开拓自己的青青草原
  7. tensorflow - model.predict
  8. Pytorch实现Seq2Seq(Attention)字符级机器翻译
  9. Android系统是目前最为流行的手机系统之一
  10. 你真的了解企业虚拟化吗?