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

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

  • 相关阅读:
    美女检测器
    汉字动画程序的原理
    值类型不是值类型(ValueType is NOT a Value Type):闲谈.Net类型
    PowerShell 简介
    Visual Studio 2012 RC 发布
    使用 MvcMiniProfiler 监控EF 4.1 with MySQL Provider
    NuGet安装及简单使用
    发布自己的NuGet程序
    Qizmt 单机及分布式部署注意事项
    JDynamic :支持Json反序列化为Dynamic对象
  • 原文地址:https://www.cnblogs.com/lang5230/p/5328166.html
Copyright © 2011-2022 走看看