设计模式的理解: 职责链模式 (Chain of Responsibility)
职责链模式(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)相关推荐
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
- 职责链模式(Chain of Responsibility)(对象行为型)
1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 重温设计模式(三)——职责链模式(chain of responsibility)
一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...
- 『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路
23种设计模式+额外常用设计模式汇总 (持续更新) 问题抽象 客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的. 对于客户端而言,无所谓谁来处理,反正有对象处理就 ...
- 职责链模式(chain of responsibility)
原文地址 一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不 ...
- 职责链模式 Chain of Responsibility
职责链模式的作用在于职责转移,其实现实际上是一个链表 package chainofres;public abstract class Handler {protected Handler succe ...
- 37职责链模式(Chain of Responsibility Pattern)
动机(Motivate): 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的 ...
- [设计模式-行为型]责任链模式(Chain of Responsibility)
概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一 ...
最新文章
- C# 对应 Oracle 存储过程 的 SYS_REFCURSOR 应该 传入什么类型的参数?
- 关闭线程池 shutdown 和 shutdownNow 的区别
- .NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程
- mybatis数组和集合的长度判断及插入
- WaitForMultipleObjects函数有效值分析
- alarm/pause
- Deployment vs ReplicationController in Kubernetes
- jango web开发指南_Web前端“月薪过万”必读的一些入门书籍和网站!
- try catch和if else
- 每周一个 Python 模块 | array
- Luogu P2880 [USACO07JAN]平衡的阵容Balanced Lineup (ST表模板)
- 解决Tuxera NTFS for Mac软件安装问题 手动批准mac内核扩展
- redis 介绍与安装
- blender源代码分析----第三方库的说明
- linux 实时显示网速,linux 实时显示网速bash
- 第二十九篇 -- 学习第五十六天打卡20190826
- 13. 设计模式之反转原则:如何减少代码间的相互影响?
- 神经网络训练样本的标签,训练图像识别神经网络
- openssl库android版的编译
- [转]探索 CouchDB