Chain Of Responsibility(职责连)-对象行为型模式
Posted 沪马农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Chain Of Responsibility(职责连)-对象行为型模式相关的知识,希望对你有一定的参考价值。
1.意图
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2.动机
给多个对象处理一个请求的机会,从而解耦发送者和接收者。
3.适用性
- 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
4.结构
5.代码实例
//Handler.h #include <memory> class AbstractHandler { public: virtual void HandleRequest() = 0; virtual void SetHandler(std::shared_ptr<AbstractHandler> pHandler); protected: std::shared_ptr<AbstractHandler> m_pHandler; }; class BaseHandler : public AbstractHandler { public: virtual void HandleRequest(); }; class ConcreteHandler1 : public BaseHandler { public: void HandleRequest(); }; class ConcreteHandler2 : public BaseHandler { public: void HandleRequest(); };
//Handler.cpp #include <iostream> #include "Handler.h" void AbstractHandler ::SetHandler(std::shared_ptr<AbstractHandler> pHandler) { m_pHandler = pHandler; }; void BaseHandler ::HandleRequest() { std::cout << "Base Handler Handled" << std::endl; }; void ConcreteHandler1 ::HandleRequest() { std::cout << "ConcreteHandler1 Handled" << std::endl; m_pHandler->HandleRequest(); }; void ConcreteHandler2 ::HandleRequest() { std::cout << "ConcreteHandler2 Handled" << std::endl; m_pHandler->HandleRequest(); };
//client #include "Handler.h" int main() { std::shared_ptr <AbstractHandler> pConcreteHandler1(new ConcreteHandler1); std::shared_ptr <AbstractHandler> pConcreteHandler2(new ConcreteHandler2); std::shared_ptr <AbstractHandler> pBaseHandler(new BaseHandler); pConcreteHandler1->SetHandler(pConcreteHandler2); pConcreteHandler2->SetHandler(pBaseHandler); pConcreteHandler1->HandleRequest(); while(1); }
6.测试结果
以上结果为每个handler执行后均调用上一级的handler执行。
7.效果
- 降低耦合度 该模式使得一个对象无需知道是其他哪一个对象处理其请求。
- 增强了给对象指派职责的灵活性
- 不保证被接受
以上是关于Chain Of Responsibility(职责连)-对象行为型模式的主要内容,如果未能解决你的问题,请参考以下文章
20 关卡设计-责任链(Chain of Responsibility)
职责链模式- Chain of Responsibility
设计模式入门之职责链模式Chain Of Responsibility
B5:责任链模式 Chain Of Responsibility