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

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

  • 相关阅读:
    学习笔记 MYSQL报错注入(count()、rand()、group by)
    学习笔记 HTTP参数污染注入
    学习笔记 MSSQL显错手工注入
    代码审计入门后审计技巧
    字符串的排列
    二叉搜索树与双向链表
    复杂链表的复制
    二叉树中和为某一值的路径
    二叉搜索树的后序遍历序列
    从上往下打印二叉树
  • 原文地址:https://www.cnblogs.com/lang5230/p/5328166.html
Copyright © 2011-2022 走看看