我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
来源:互联网 发布:东方神起 知乎 编辑:程序博客网 时间:2024/05/01 09:52
责任链模式是面向对象中的一种软件设计模式,它包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。
概述:
辛辛苦苦了工作了一年,终于可以加薪了,向主管提交了加薪申请,主管一看不得了,自己职权不够,批不了,主管把申请上交总监,总监发现自己也批不了,申请到了总经理手中,总经理一看,小伙子口气不小了,有胆识敢申请,先来谈下心。预知后事如何,请看下回分解。
这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
类图与实例:
抽象处理者(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.责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。
LCL_data原创于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/9042739】
看到这里的各位加薪申请都是general批... :-))
- 我所理解的设计模式(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)
- Bloom Filter 算法详解
- 1005. Spell It Right (20)
- php导出word文档样式以及word文档分页
- moodle 板块(block)开发流程小记
- [概率]m个球扔到n个盒子
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- [转]比较全面的gdb调试命令
- 图的邻接多重表存储
- 前端第一周(读书笔记)
- 建立用户身份验证机制和个性化设置总结(1)
- Seeking USB Serial Com Port in Windows Automatically : via PID VID
- Spring学习笔记 IOC原理实现
- IOS tabbar的显示与隐藏
- MongoDb、Mongodb php扩展 安装步骤及相关知识