zoukankan      html  css  js  c++  java
  • C++设计模式---职责链模式

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

    这里发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。

    职责链模式结构图:

     

    Handler类,定义一个处理请求的接口

    class Handler

    {

     protected:

         Handler  *successor;

     public:

    void   SetSuccessor(Handler  *successor)   //设置继任者

    {

         this->successor = successor;

    }

    void  HandleRequest(int  request)=0;       //处理请求的抽象方法

    };

    ConcreteHandler类,具体处理者类,处理它所负者的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。

    ConcreteHandler1,当请求数在0到10之间则有权处理,否则转到下一位

    class ConcreteHandler1 : Handler

    {

     public:

    void  HandleRequest(int  request)

    {

         if(request >= 0 && request<10)

         {

              cout<< “ConcreteHandler1”<<“处理请求:”<<request<<endl;

         }

         else if(successor != NULL)

         {

              successor->handleRequest(request);

         }

    }

    };

    ConcreteHandler2,当请求数在10到20之间则有权处理,否则转到下一位。

    class ConcreteHandler2 : Handler

    {

     public:

    void  HandleRequest(int  request)

    {

         if(request >= 10 && request<20)

         {

              cout<< “ConcreteHandler2”<<“处理请求:”<<request<<endl;

         }

         else if(successor != NULL)

         {

              successor->handleRequest(request);

         }

    }

    };

    ConcreteHandler3,当请求数在20到30之间则有权处理,否则转到下一位。

    class ConcreteHandler3 : Handler

    {

     public:

    void  HandleRequest(int  request)

    {

         if(request >= 20 && request<30)

         {

              cout<< “ConcreteHandler3”<<“处理请求:”<<request<<endl;

         }

         else if(successor != NULL)

         {

              successor->handleRequest(request);

         }

    }

    };

    客户端代码,向链上的具体处理者对象提交请求。

    void main()

    {

        Handler  *h1 = newConcreteHandler1();

        Handler  *h2 = newConcreteHandler2();

        Handler  *h3 = newConcreteHandler3();

        h1->SetSuccessor(h2);

        h2->SetSuccessor(h3);

       

        int request[]={2,5,14,22,18,3,27,20};

       

        for(int i=0;i<8;i++)

         {

             h1->HandleRequest(request[i]);

        }

    }

    职责链的好处:

    1.      当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

    2.      可以随时地增加或修改处理的请求的结构,增强了对象指派职责的灵活性

  • 相关阅读:
    ASP.NET MVC5+EF6+EasyUI 后台管理系统(28)-系统小结
    用谷歌浏览器来当手机模拟器
    解决PHP使用CVS导出Excel乱码问题
    Linux系统中关于Sqlite3中文乱码问题及解决办法
    解决excel日期变成数字的问题
    基于IE的多标签的浏览器-世界之窗2.4
    Thinkphp 获取所有子分类或父分类ID
    PhpExcel 删除默认的Sheet
    Mysql 创建表时错误:Tablespace for table `tablexx` exists. Please DISCARD the tablespace before IMPORT.
    关于ThinkPhp中getField方法存在的问题
  • 原文地址:https://www.cnblogs.com/riskyer/p/3354348.html
Copyright © 2011-2022 走看看