Advertisement

职责链模式 chain of responsibility

阅读量:

意图:

让多个实体有机会接收并处理请求,从而防止发送者与接收者之间出现耦合作用。将这些实体串联起来形成一个链条。

并沿着这条链传递改请求,直到有一个对象处理它为止。

结构:

代码:

复制代码
 class CHandler{

    
 public:
    
 void SetHandler(CHanlder * pH){ m_pHandler =pH; }
    
 virtual void HandleRequest(unsign int i);
    
 protect:
    
 CHandler * m_pHandler;
    
 }
    
  
    
 class CConreteHandler1:public CHandler{
    
 public:
    
 void HandleRequest(unsign int i){
    
 if(i<10)
    
   count<<"handle i sucss !\n";
    
 else
    
   NULL!=m_pHander?m_pHandler->HandleRequest(i):NULL;
    
 }
    
  
    
 class CConreteHandler2:public CHandler{
    
 public:
    
 void HandleRequest(unsign int i){
    
 if(i<20){
    
   count<<"handle i sucss !\n";
    
 else
    
 NULL!=m_pHander?m_pHandler->HandleRequest(i):NULL;
    
 }
    
  
    
 class CConreteHandler3:public CHandler{
    
 public:
    
 void HandleRequest(unsign int i){
    
 if(i<30){
    
   count<<"handle i sucss !\n";
    
 else
    
   NULL!=m_pHander?m_pHandler->HandleRequest(i):NULL;
    
 }
    
    
    
    
    代码解读

客户端:

复制代码
 void main(){

    
 unsign int array[]={1,15,23,6};
    
 CHandler *pHandller1 = new CConreteHandler1();
    
 CHandler *pHandller2 = new CConreteHandler2();
    
 CHandler *pHandller3 = new CConreteHandler3();
    
  
    
 int num =sizeof(array)/sizeof(unsign int);
    
 for(int i=0;i<num;i++)
    
     pHandler1->HandleRequest(array[i]);
    
  
    
 NULL!=pHandller1?delete [] pHandller1:NULL;
    
 NULL!=pHandller2?delete [] pHandller2:NULL;
    
 NULL!=pHandller3?delete [] pHandller3:NULL;
    
 }
    
    
    
    
    代码解读

总结:

职责链的存在导致接收者和发送者没有明确掌握对方的相关信息,并不了解整个链条的结构。从而使得各相关方之间的互动更加便捷

其关联仅需单个指针指向后继者而不必维护所有候选者

  1. 客户端能够自行设定职责链的架构。这也就意味着我们能够灵活地调整处理单个请求的架构。增强功能则为确保系统能够应对各种复杂的请求模式提供了基础保障。

对象指派职责的灵活性。

全部评论 (0)

还没有任何评论哟~