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

简言之,当有一个请求发送时,有一群对象可以按照优先级接受这些请求。职责链模式就是通过链表的形式完成下面操作,在现在来看这种实现方法有点落后,但是放在1994年还是很有指导意义的。

在图形界面程序中有些控件可以触发单机事件,例如

一个Winform 窗体上放了一个  控件组GroupBox   ,控件组上放了一个Label 标签控件。我们设置 Label 标签 和 GroupBox 控件组没有单击不发生作用,当单击Label时,单击请求自上而下的传递到Winform中触发Winform 窗体的单击事件:

class Requset{
private:string msg_;
public:Requset(){msg_ ="点击请求";}string  getMsg(){return msg_;};
}/****这个类时重点****/
class ChainHandler{ChainHandler * nextHandler;void sendRequestToNextHandler (const Requset & rq){if(nextHandler !=nullptr){nextHandler->handle(rq);}}protected:virtual bool canHandleRequest() = 0;virtual void handleProcess(const Requset & rq)=0;
public:ChainHandler(){nextHandler =nullptr;}void setNextHandler(ChainHandler * next){nextHandler=next;}void handle(const Requset & rq){if(canHandleRequest()){handleProcess(rq);}else{sendRequestToNextHandler(rq);}}
}/**********接下来的类只要负责实现canHandleRequest和handleProcess就行************/
class Winform :public ChainHandler{public:void handleProcess(const Requset & rq){cout<<"Winform 处理了"<<rq.getMsg();}bool canHandleRequest(){return true;}
}class GroupBox :public ChainHandler{public:void handleProcess(const Requset & rq){}bool canHandleRequest(){return false;}
}class Label :public ChainHandler{void handleProcess(const Requset & rq){ cout<<"Label 传递了"<<rq.getMsg();}public:bool canHandleRequest(){return false;}void handle(const Requset & rq){handleProcess(rq);sendRequestToNextHandler(rq);}
}

ChainHandler 类是重点,用户调用handle 函数实现 “当自己不能处理,就传递到下一个关联控件“的需求 。当然也可以重写handle 实现“当自己处理完后,也传递到下一个关联控件“,只需要把if逻辑删除就行

void main(){Label label;GroupBox groupbox;Winform winform ;Request rq;label.setNextHandler(&groupbox);groupbox.setNextHandler(&winform);//---------------------groupbox.handle(rq);//输出  Winform 处理了点击请求//-------------------------label.handel(rq);//输出  Label 传递了点击请求   Winform 处理了点击请求//-------------------------
}

设计模式的理解: 职责链模式 (Chain of Responsibility)相关推荐

  1. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  2. 职责链模式(Chain of Responsibility)(对象行为型)

    1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...

  3. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 重温设计模式(三)——职责链模式(chain of responsibility)

    一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...

  5. 『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路

    23种设计模式+额外常用设计模式汇总 (持续更新) 问题抽象 客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的. 对于客户端而言,无所谓谁来处理,反正有对象处理就 ...

  6. 职责链模式(chain of responsibility)

    原文地址 一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不 ...

  7. 职责链模式 Chain of Responsibility

    职责链模式的作用在于职责转移,其实现实际上是一个链表 package chainofres;public abstract class Handler {protected Handler succe ...

  8. 37职责链模式(Chain of Responsibility Pattern)

    动机(Motivate):     在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合.     如何使请求的 ...

  9. [设计模式-行为型]责任链模式(Chain of Responsibility)

    概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一 ...

最新文章

  1. C# 对应 Oracle 存储过程 的 SYS_REFCURSOR 应该 传入什么类型的参数?
  2. 关闭线程池 shutdown 和 shutdownNow 的区别
  3. .NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程
  4. mybatis数组和集合的长度判断及插入
  5. WaitForMultipleObjects函数有效值分析
  6. alarm/pause
  7. Deployment vs ReplicationController in Kubernetes
  8. jango web开发指南_Web前端“月薪过万”必读的一些入门书籍和网站!
  9. try catch和if else
  10. 每周一个 Python 模块 | array
  11. Luogu P2880 [USACO07JAN]平衡的阵容Balanced Lineup (ST表模板)
  12. 解决Tuxera NTFS for Mac软件安装问题 手动批准mac内核扩展
  13. redis 介绍与安装
  14. blender源代码分析----第三方库的说明
  15. linux 实时显示网速,linux 实时显示网速bash
  16. 第二十九篇 -- 学习第五十六天打卡20190826
  17. 13. 设计模式之反转原则:如何减少代码间的相互影响?
  18. 神经网络训练样本的标签,训练图像识别神经网络
  19. openssl库android版的编译
  20. [转]探索 CouchDB

热门文章

  1. NIOS2随笔——uCOS-II实时操作系统
  2. [转]一张图理解prototype、proto和constructor的三角关系
  3. SpringMVC 学习系列 (4) 之 数据绑定 -1
  4. eclipse 安装svn插件 及试用
  5. APPSERV下安装pear db和auth
  6. 【C语言】二维数组遍历的3种方式
  7. 2020 操作系统第二次习题
  8. Linux Diff命令用法
  9. linux shell 从变量中按指定字符切割字符串
  10. kylin分析引擎:运行原理、维度和Cube等名词解释、核心算法