我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
来源:互联网 发布:用友软件客服电话 编辑:程序博客网 时间:2024/05/01 05:59
概述:
辛辛苦苦了工作了一年,终于可以加薪了,向主管提交了加薪申请,主管一看不得了,自己职权不够,批不了,主管把申请上交总监,总监发现自己也批不了,申请到了总经理手中,总经理一看,小伙子口气不小了,有胆识敢申请,先来谈下心。预知后事如何,请看下回分解。
这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
类图与实例:
抽象处理者(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.责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。
0 0
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 【设计模式】责任链模式(Chain of Responsibility Pattern)
- 设计模式——责任链(Chain of Responsibility)
- (C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 责任链模式(Chain Of Responsibility Pattern)
- 责任链模式(Chain of Responsibility Pattern)
- 设计模式 - Chain of Responsibility Pattern(责任链模式)
- 设计模式 - Chain of Responsibility Pattern(责任链模式)
- 设计模式之责任链模式--- Pattern chain-of-responsibility
- Java设计模式--责任链模式【Chain of Responsibility Pattern】
- 设计模式【责任链模式Chain of Responsibility Pattern】
- java设计模式——责任链模式(Chain of Responsibility Pattern)
- 如何让孩子爱上设计模式 ——22.责任链模式(Chain of Responsibility Pattern)
- Java设计模式——责任链模式(Chain of Responsibility Pattern)
- 设计模式学习—责任链模式(Chain of Responsibility Design Pattern)
- 设计模式6--责任链模式(The chain of responsibility pattern)
- 我所理解的设计模式(C++实现)——模板方法模式(Template Method Pattern)
- HBase如何合理设置客户端Write Buffer
- 我所理解的设计模式(C++实现)——命令模式(Command Pattern)
- python学习——python文件
- 【呆子谈管理】:扬长,永远不要去补短
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- CF GYM 100548 Color(2014ACM西安现场赛Problem F)
- 我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)
- 我所理解的设计模式(C++实现)——享元模式(Flyweight Pattern)
- linux开发环境搭建
- 我所理解的设计模式(C++实现)——外观模式(Facade Pattern)
- Android中RelativeLayout各个属性
- 细说php 第二版(章节+视频+项目+练习题+源码)
- CF GYM 100548 The Problem Needs 3D Arrays(2014ACM西安现场赛Problem C)