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

    责任链模式C++实现

    1定义

    使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象链成一条链,并沿着这条链传递该请求/命令,直到有对象处理它为止

    注:这里的请求、命令正是可以和命令模式进行结合的地方

    2类图

    class Handler

    {

    private:

      Handler* nextHandler;

    protected:

      Handler();

    pubic:

      virtual~Handler()=0;

      //每个处理者都必须对请求作出处理,如果是自己能处理的,自己处理,并且返回结果。否则,传递给下一个处理者

      Response handleMessage(Request *request)

      {

        Response *res = NULL;

        //如果请求级别和处理者级别相同/有能力处理,那么处理

        if(getHandlerLevel() == request.getRequestLevel())

        {

          res = echo(request);

        }

        else

        {

          if(nextHandler!= NULL)

          {

            res = nextHandler.handleMessage(request);

          }

          else

          {

            //没有适当的处理者,业务自行处理

          }

        }

      }

      void setNext(Handler hand)

      {

        nextHandler = hand;

      }

    protected:

      virtual Level getHandlerLevel()=0;

      //每个处理者都必须实现处理任务

      Response echo(Request res);

    };

    注:抽象处理者的三个职责:①定义请求处理方案,唯一对外开放;②定义一个链的编排方法setNext;③定义具体处理者的两个方法(权限获取和处理)

    class ConcreteHandler:public Handler

    {

    public:

      ConcreteHandler();

      ~ConcreteHandler();

    protected:

      Response echo()

      {

        //完成逻辑

        return NULL;

      }

      Level getHandlerLevel()

      {

        //设置自己的处理级别

        return;

      }

    };

    //等级设置。可以在内部详细处理优先级设置问题

    class Level{};

    //请求封装

    class Request

    {

    public:

      Level getRequestLevel()

      {

        return NULL;

      }

    };

    //处理者返回的数据

    class Response

    {};

    4提升性

    ①在实际中对于责任链的设置多半是固定的,所以可以将之封装从而实现客户端的最少知道(迪米特原则)

    ②在责任链中设置最大结点数

    5应用

    ①优点

    将请求和处理分开,达到解耦,迪米特。

    ②缺点

    链长度过长时就会有效率问题,其次是调试问题(这个问题也类似于递归)

    6 总结

    责任链可以作为一种补救措施.--中介者模式---模板方法模式

  • 相关阅读:
    Eclipse Clojure 开发插件
    leiningen安装记录
    XX-NET史上最详细完整教程
    使用Chrome浏览器设置XX-net的方法
    Sublime text 3搭建Python开发环境及常用插件安装
    python集合(set)类型的操作
    python编码问题在此终结
    新版的 selenium已经放弃PhantomJS改用Chorme headless
    python爬虫积累(一)--------selenium+python+PhantomJS的使用(转)
    Pyinstaller打包selenium去除chromedriver黑框问题解决!!!
  • 原文地址:https://www.cnblogs.com/lang5230/p/5328166.html
Copyright © 2011-2022 走看看