责任链模式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 总结

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

最新文章

  1. html中如何添加提示信息
  2. 关于oracle with as用法
  3. lcx转发 【解决内网没法链接3389 的问题】
  4. 斜率dp cdq 分治
  5. 让CALayer的shadowPath跟随bounds一起做动画改变-b
  6. spark1.1.0源码阅读-taskScheduler
  7. zoj 2376 Ants
  8. 服务器端开发(Python/C++)-今日头条-拉勾网-最专业的互联网招聘平台
  9. textarea定位光标
  10. 【原】如何获取Java动态生成类?
  11. Android源码解析——AsyncTask
  12. 09 使用Tensorboard查看训练过程
  13. Zabbix通过JMX方式监控java中间件
  14. idea添加JPA导出实体类
  15. 浏览器解析JavaScript原理
  16. Codeforces 1079D Barcelonian Distance(计算几何)
  17. python模块之时间模块
  18. 使用autoconf与automake自动生成MakeFile文件
  19. 【拾遗】理解Javascript中的Arguments
  20. thinkphp3.2 实现点击图片或文字进入内容页

热门文章

  1. (转)C语言中Exit函数的使用
  2. adb push ,adb pull和adb install的区别
  3. js 有小数点数据求和多出小数点问题记录
  4. js null, undefined, NaN, ‘’, false, 0, ==, === 全验证
  5. SQL Server创建事务——锁
  6. Nginx基本介绍
  7. PL/SQL编程—函数
  8. http超文本传输协议,get与post区别
  9. 如何做好Web接口测试
  10. window连接linux共享