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

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

设计模式--责任链模式C++实现的更多相关文章

  1. java 设计模式 -- 责任链模式

    设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...

  2. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  3. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  4. 我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  5. Java设计模式-责任链模式

    提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...

  6. Java与设计模式-责任链模式

    责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...

  7. php设计模式-责任链模式

    责任链模式更像是一种简化多种场景下调用处理的一种设计模式,特别适合if-else分支判断很多的场景.比如是根据不同会员等级给予不同的优惠力度. 它的定义:对象的调用是由下家的应用连接起来的处理链.一直 ...

  8. C#设计模式-责任链模式(Chain of Responsibility Pattern)

    引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...

  9. php 23种设计模式 - 责任链模式

    责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...

  10. 23种设计模式--责任链模式-Chain of Responsibility Pattern

    一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...

随机推荐

  1. CentOS7.2.1511安装docker

    一.使用之前的安装方法不好使,删除的安装包第一次安装的时候直接使用epel中的源,安装完成后服务无法启动然后删除重新安装,参考文档:https://www.cnblogs.com/yufeng218/ ...

  2. lamp环境的搭建和安装

    最近,部门有些系统需要迁移到新的机器上,因此需要在新的机器上安装lamp和lnmp的环境,因此在这里总结一下: 一. 安装lamp环境的步骤:  (1).因为是新的机器,因此需要安装gcc的各种环境: ...

  3. 网页中Cache各字段含义

    Pragma 当该字段值为"no-cache"的时候(事实上现在RFC中也仅标明该可选值),会知会客户端不要对该资源读缓存,即每次都得向服务器发一次请求才行. Expires 有了 ...

  4. mac下python环境pip报错[SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590) 的解决方法

    1.mac下python环境pip报错: issuserdeMacBook-Pro:~ issuser$ pip install pyinstallerCollecting pyinstaller  ...

  5. st试用笔记

    1.关于轮询 我的写法: var time_count = 0; var timer = setInterval(function(){ async.ajax({ url:'', data:'', s ...

  6. WordPress文章自动提取tag并添加链接

    我们在编写文章时,经常需要添加一些标签关键词的链接,这样不仅可以优化我们的内链,对用户来说也可以参照相关的文章,如果对文章的关键字进行手动添加链接,那样对我们来说太麻烦了,而且在标签关键词很多的情况下 ...

  7. [笔记] Ubuntu 18.04源码安装caffe流程

    虽然Ubuntu 18.04可以通过apt安装caffe,但是为了使用最新的代码,还是值得从源码安装一遍的. 安装环境 OS: Ubuntu 18.04 64 bit 显卡: NVidia GTX 1 ...

  8. C++ char float int string 之间的转换

    string str = "123"; string 转 int int i = atoi( str.c_str() ); string 转 float float f = ato ...

  9. python-静态方法staticmethod、类方法classmethod、属性方法property

    Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def  ...

  10. [转]将Eclipse设置为黑色主题 方式一

    将Eclipse设置为黑色主题 觉得黑色的主题&配色很高大上,于是花了点时间实践出下面一种方法. 修改代码编辑区配色 修改整个软件主题 先上成果图: 但是进度条依旧是白色的,不知道怎么弄了╮( ...