你的位置:首页 > ASP.net教程

[ASP.net教程]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.效果

  • 降低耦合度    该模式使得一个对象无需知道是其他哪一个对象处理其请求。
  • 增强了给对象指派职责的灵活性    
  • 不保证被接受