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 总结

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

  • 相关阅读:
    关于在MAC上进行 LARAVEL 环境 Homestead 安装过程记录
    js 贷款计算器
    js 实现阶乘
    js 两点间距离函数
    composer Your requirements could not be resolved to an installable set of packages
    vue 项目优化记录 持续更新...
    vue 项目打包
    vue 真机调试页面出现空白
    vue 真机调试
    谈谈-Android状态栏的编辑
  • 原文地址:https://www.cnblogs.com/lang5230/p/5328166.html
Copyright © 2011-2022 走看看