(二十)职责链模式
2016-03-14 15:45
155 查看
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。【DP】
![](https://img-blog.csdn.net/20160314154414928?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20160314154449291?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
优点:
1.当客户提交一个请求时,请求是沿着链传递直到有一个ConcreteHandler对象处理它。【DP】
2.接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用。【DP】
3.随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性【DP】
缺点:一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理,这就很糟糕了,需要事先考虑周全。
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。【DP】
// ResponsbilityChain.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; class Handler { protected: Handler *successor; public: virtual ~Handler(){} void SetSuccessor(Handler *successor) { this->successor = successor; } public: virtual void HandleRequest(int request) = 0; }; class ConcreteHandler1 : public Handler { public: void HandleRequest(int request) { if (request >= 0 && request < 10) { cout << "ConcreteHandler1" << "处理请求" << request << endl; } else if (successor != 0) { successor->HandleRequest(request); } } }; class ConcreteHandler2 : public Handler { public: void HandleRequest(int request) { if (request >= 10 && request < 20) { cout << "ConcreteHandler2" << "处理请求" << request << endl; } else if (successor != 0) { successor->HandleRequest(request); } else if (successor != 0) { successor->HandleRequest(request); } } }; class ConcreteHandler3 : public Handler { public: void HandleRequest(int request) { if (request >= 20 && request < 30) { cout << "ConcreteHandler2" << "处理请求" << request << endl; } else if (successor != 0) { successor->HandleRequest(request); } } }; int _tmain(int argc, _TCHAR* argv[]) { Handler *h1 = new ConcreteHandler1; Handler *h2 = new ConcreteHandler2; Handler *h3 = new ConcreteHandler3; h1->SetSuccessor(h2);//设置链条 h2->SetSuccessor(h3); int requests[] = { 2, 5, 14, 22, 18, 3, 27, 20 }; for (int i = 0; i < sizeof(requests) / sizeof(int); ++i) { h1->HandleRequest(requests[i]); } return 0; }
优点:
1.当客户提交一个请求时,请求是沿着链传递直到有一个ConcreteHandler对象处理它。【DP】
2.接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用。【DP】
3.随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性【DP】
缺点:一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理,这就很糟糕了,需要事先考虑周全。
相关文章推荐
- java 简单的加解密操作
- 如何优雅的用Axure绘制高保真原型心得分享
- objective-c感悟(二)内存管理
- Android基础-MultiAutoCompleteTextView用法
- Android笔记之 文件保存、压缩与清空删除
- 进程和线程
- [嵌入式开发板] iTOP-4412实现web控制led
- 如何用Fiddler对Android应用进行抓包
- 如何用Fiddler对Android应用进行抓包
- 如何用Fiddler对Android应用进行抓包
- No1 使用ThinkPHP开发网站(3月14日)
- 线段树(倒序操作):POJ 2828 Buy Tickets
- iOS中获取系统相册中的图片
- sqlite 数据类型 全面
- mybatis
- HTML5开发移动web应用—JQuery Mobile(4)-事件
- 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下)
- 给包文件增加注释
- [数据结构-查询区间最小值小结(RMQ问题(Range Minimum Query))]
- 查找