设计模式之责任链模式

来源:互联网 发布:淘宝联盟教程2016 编辑:程序博客网 时间:2024/05/16 06:35

1、责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

UML图如下:

 


2、 当客户提交一个请求时,请求是沿着链传递直至有一个ConcreteHandler对象负责处理。接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是责任链可以简化对象的互相连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。

可以随时地增加或修改处理一个请求的结构,增强了给对象指派责任的灵活性。


3、C++代码实现

[cpp] view plaincopy
  1. #include <iostream>  
  2. using namespace std;  

  3. /* Handler类,定义一个处理请求的接口 */  
  4. class Handler   
  5. {  
  6. protected:  
  7.     Handler * pSuccessor;  
  8. public:  
  9.     void setSuccessor(Handler * pSuccessor)   
  10.     {  
  11.         this->pSuccessor = pSuccessor;  
  12.     }  
  13.     virtual void HandleRequest(int request) = 0;  
  14. };  

  15. /* ConcreteHandler类,具体处理类,处理它所负责的请求,可访问 
  16.     它的后续者,如果可以处理该请求,就处理之,否则就将该请求发 
  17.     给它的后继者。*/  
  18. class ConcreteHandle1 : public Handler   
  19. {  
  20. public:  
  21.     void HandleRequest(int request)   
  22.     {  
  23.         if (request >= 0 && request < 10)   
  24.         {  
  25.             cout << "ConcreteHandler1 deal the request = " << request << endl;  
  26.         }  
  27.         else if (pSuccessor != NULL)   
  28.         {  
  29.             pSuccessor->HandleRequest(request);  
  30.         }  
  31.     }  
  32. };  
  33. class ConcreteHandle2 : public Handler   
  34. {  
  35. public:  
  36.     void HandleRequest(int request)   
  37.     {  
  38.         if (request >= 10 && request < 20)   
  39.         {  
  40.             cout << "ConcreteHandle2 deal the request = " << request << endl;  
  41.         }  
  42.         else if (pSuccessor != NULL)   
  43.         {  
  44.             pSuccessor->HandleRequest(request);  
  45.         }  
  46.     }  
  47. };  
  48. class ConcreteHandle3 : public Handler  
  49. {  
  50. public:  
  51.     void HandleRequest(int request)   
  52.     {  
  53.         if (request >= 20 && request < 30)   
  54.         {  
  55.             cout << "ConcreteHandle3 deal the request = " << request << endl;  
  56.         }  
  57.         else if (pSuccessor != NULL)   
  58.         {  
  59.             pSuccessor->HandleRequest(request);  
  60.         }  
  61.     }  
  62. };  

  63. /* 客户端代码,向链上的具体处理者对象提交请求。 */  
  64. int main() {  
  65.     Handler * ph1 = new ConcreteHandle1();  
  66.     Handler * ph2 = new ConcreteHandle2();  
  67.     Handler * ph3 = new ConcreteHandle3();  
  68.     ph1->setSuccessor(ph2);  
  69.     ph2->setSuccessor(ph3);  
  70.     int request[] = {2, 5, 14, 22, 18, 3, 27, 20};  
  71.     int len = sizeof(request) / sizeof(int);  
  72.     for (int i = 0; i < len; ++i)   
  73.     {  
  74.         ph1->HandleRequest(request[i]);  
  75.     }  
  76.     return 0;  
  77. }  



 

0 0
原创粉丝点击