1.意圖 使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。 2.動機 給多個對象處理一個請求的機會,從而解耦發送者和接收者。 3.適用性 有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。 ...
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.效果
- 降低耦合度 該模式使得一個對象無需知道是其他哪一個對象處理其請求。
- 增強了給對象指派職責的靈活性
- 不保證被接受