设计模式——责任连模式
概述:
辛辛苦苦了工作了一年,终于可以加薪了,向主管提交了加薪申请,主管一看不得了,自己职权不够,批不了,主管把申请上交总监,总监发现自己也批不了,申请到了总经理手中,总经理一看,小伙子口气不小了,有胆识敢申请,先来谈下心。预知后事如何,请看下回分解。
这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
类图与实例:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
样例:
- #include <iostream>
- #include <string>
- using namespace std;
- // 请求
- class Request
- {
- public:
- int m_nNumber;
- };
- // 管理者
- class Manager
- {
- public:
- Manager(string temp) { name = temp; }
- void SetSuccessor(Manager* temp) { manager = temp; }
- virtual void GetRequest(Request* request) = 0;
- protected:
- Manager* manager;
- string name;
- };
- // 经理
- class CommonManager : public Manager
- {
- public:
- CommonManager(string strTemp) : Manager(strTemp) {}
- virtual void GetRequest(Request* request);
- };
- void CommonManager::GetRequest(Request* request)
- {
- if (request->m_nNumber>=0 && request->m_nNumber<1000)
- {
- cout << name << " 处理了请求: " << request->m_nNumber << endl;
- }
- else
- {
- manager->GetRequest(request);
- }
- }
- // 总监
- class Majordomo : public Manager
- {
- public:
- Majordomo(string strTemp) : Manager(strTemp) {}
- virtual void GetRequest(Request* request);
- };
- void Majordomo::GetRequest(Request* request)
- {
- if (request->m_nNumber <= 5000)
- {
- cout << name << " 处理了请求: " << request->m_nNumber << endl;
- }else
- {
- manager->GetRequest(request);
- }
- }
- //总经理
- class GeneralManager: public Manager
- {
- public:
- GeneralManager(string name):Manager(name) {}
- virtual void GetRequest(Request* request) //总经理可以处理所有请求
- {
- cout << name << " 处理了请求: " << request->m_nNumber << endl;
- }
- };
- int main(){
- Manager* common = new CommonManager("张经理");
- Manager* major = new Majordomo("李总监");
- GeneralManager* general = new GeneralManager("赵总");
- common->SetSuccessor(major);
- major->SetSuccessor(general);
- Request* rq = new Request();
- rq->m_nNumber = 999;
- common->GetRequest(rq);
- rq->m_nNumber = 4999;
- common->GetRequest(rq);
- rq->m_nNumber = 6999;
- common->GetRequest(rq);
- delete rq;
- delete major;
- delete common;
- delete general;
- return 0;
- }
要点与实现:
1.要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当.
2.责任链模式并不创建责任链。责任链的创建必须由系统的其它部分创建出来。
3.责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。
转载于:https://www.cnblogs.com/nktblog/p/4027097.html
设计模式——责任连模式相关推荐
- Java设计模式-责任链模式
Java设计模式-责任链模式,我想这是值得你了解一下下的啦. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持 ...
- 设计模式--责任链模式--Java实现
设计模式–责任链模式–Java实现 责任链模式–链式数据结构–内存消耗–Java的awt事件一开始用责任链模式后来改为观察者模式–为什么呢?–现在的应用–dom事件–异常处理机制-过滤器链–等等 学习 ...
- 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器
理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式 1. 开闭.单一职责.里氏替换.接口隔离等设计原则 2. 随处可见的模板方法 3. nginx中核心设计模式 责任链模式 4. 责 ...
- java责任链模式审批请假_Java设计模式-责任链模式
Java设计模式-责任链模式 Java版本:jdk1.8 IDE:IDEA 一 前言 本文介绍责任链模式以及Java下的实现. 二 概念 1.什么是责任链模式 责任链模式(Chain of Respo ...
- 一起学设计模式 - 责任链模式
责任链模式(ChainOfResponsibilityPattern)属于 行为型模式的一种,将请求沿着一条链传递,直到该链上的某个对象处理它为止. 概述 定义如下:一个请求有多个对象来处理,这些对象 ...
- 大话设计模式—责任链模式
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...
- 设计模式 责任链模式
责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计 ...
- php设计模式-责任链模式
最近重构代码发现责任链模式非常实用,所以简单总结了一下.总体来说,责任链模式更像是一种简化多种场景下调用处理的一种设计模式,特别适合if-else分支判断很多的场景.比如是根据不同会员等级给予不同的优 ...
- 深入理解设计模式-责任链模式(职责链模式)
文章目录 一.定义 二.使用场景 三.代码样例 1.需求 2.设计一个所有处理器都要实现的接口 3.实现各种处理器 4.客户端 5. 输出 四.要点与优缺点 结尾 一.定义 避免请求发送者与接收者耦合 ...
- 工作中常用的设计模式 -- 责任链模式
一般做业务开发,不太容易有大量使用设计模式的场景.这里总结一下在业务开发中使用较为频繁的设计模式.当然语言为 Java,基于 Spring 框架. 1 责任链模式(Chain of Responsib ...
最新文章
- ubuntu终端快捷键
- python编程爱心-Python使用turtle库画一个爱心构成的爱心
- 苹果天气不显示_iPhone6开机不显示苹果售后维修案例
- 【Centos7】安装memcached
- 桌面快速启动软件AltRun----赶快使得你的桌面变整洁吧
- 空军哥军姐新装——帅
- jQuery load(),html include,iframe嵌框
- c大小写转换函数_字符处理——大小写转换编程思路扩展
- 数据库备份、还原的处理
- BIN文件和HEX文件区别
- EXCEL中的数据分析—直方图
- PyTorch 公开发布五周年;NGINX 之父 Igor Sysoev 从 F5 离职;Openfire 4.7.0 发布 | 开源日报
- GPGPU实时光线刻蚀模拟
- 视频多少帧时才不卡顿
- 玩一玩WolframAlpha计算知识引擎
- “区块链+物流运输业”能融合发展吗?
- C语言中耳熟能详的printf与scanf
- Laravel框中使用EasyWeChat 使用网页授权
- 张朝阳应该再脚踏实地一点
- 可靠性编码之格雷码(Gray码)
热门文章
- mysql 连接错误The server time zone value ‘?????????‘
- git的配置与基本使用
- 蚂蚁金服一面二面试题及答案,职位Java高级工程师
- python 两个队列进行对比
- beetl 国内下载量貌似快跟freemaker的差不多了
- Linux命令--- /dev/null和/dev/tty
- android115 自定义控件
- python 迭代器 生成器
- 【汇编优化】之x86汇编与C相互调用
- 可口可乐造型设计_瓶型设计的一些观点