本系列所有文章来自李建忠老师的设计模式笔记,系列如下:
设计模式(一)面向对象设计原则
23种设计模式(二)组件协作之模板方法
23种设计模式(三)组件协作之策略模式
23种设计模式(四)组件协作之观察者模式
23种设计模式(五)单一职责之装饰模式
23种设计模式(六)单一职责之桥模式
23种设计模式(七)对象创建之工厂方法
23种设计模式(八)对象创建之抽象工厂
23种设计模式(九)对象创建之原型模式
23种设计模式(十)对象创建之构建器
23种设计模式(十一)对象性能之单件模式
23种设计模式(十二)对象性能之享元模式
23种设计模式(十三)接口隔离之门面模式
23种设计模式(十四)接口隔离之代理模式
23种设计模式(十五)接口隔离之适配器
23种设计模式(十六)接口隔离之中介者
23种设计模式(十七)状态变化之状态模式
23种设计模式(十八)状态变化之备忘录
23种设计模式(十九)数据结构之组合模式
23种设计模式(二十)数据结构之迭代器
23种设计模式(二十一)数据结构之职责链
23种设计模式(二十二)行为变化之命令模式
23种设计模式(二十三)行为变化之访问器
23种设计模式(二十四)领域规则之解析器

文章目录

  • 动机
  • 模式定义
  • 代码
  • 要点总结

动机

  在软件构建过程中, 一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。

  如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。

模式定义

  使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

代码

#include <iostream>
#include <string>using namespace std;enum class RequestType
{REQ_HANDLER1,REQ_HANDLER2,REQ_HANDLER3
};class Reqest
{string description;RequestType reqType;
public:Reqest(const string & desc, RequestType type) : description(desc), reqType(type) {}RequestType getReqType() const { return reqType; }const string& getDescription() const { return description; }
};class ChainHandler{ChainHandler *nextChain;void sendReqestToNextHandler(const Reqest & req){if (nextChain != nullptr)nextChain->handle(req);}
protected:virtual bool canHandleRequest(const Reqest & req) = 0;virtual void processRequest(const Reqest & req) = 0;
public:ChainHandler() { nextChain = nullptr; }void setNextChain(ChainHandler *next) { nextChain = next; }void handle(const Reqest & req){if (canHandleRequest(req))processRequest(req);elsesendReqestToNextHandler(req);}
};class Handler1 : public ChainHandler{protected:bool canHandleRequest(const Reqest & req) override{return req.getReqType() == RequestType::REQ_HANDLER1;}void processRequest(const Reqest & req) override{cout << "Handler1 is handle reqest: " << req.getDescription() << endl;}
};class Handler2 : public ChainHandler{protected:bool canHandleRequest(const Reqest & req) override{return req.getReqType() == RequestType::REQ_HANDLER2;}void processRequest(const Reqest & req) override{cout << "Handler2 is handle reqest: " << req.getDescription() << endl;}
};class Handler3 : public ChainHandler{protected:bool canHandleRequest(const Reqest & req) override{return req.getReqType() == RequestType::REQ_HANDLER3;}void processRequest(const Reqest & req) override{cout << "Handler3 is handle reqest: " << req.getDescription() << endl;}
};int main(){Handler1 h1;Handler2 h2;Handler3 h3;h1.setNextChain(&h2);h2.setNextChain(&h3);Reqest req("process task ... ", RequestType::REQ_HANDLER3);h1.handle(req);return 0;
}

要点总结

  Chain of Responsibility模式的应用场合在于“一个请求可能有,多个接受者,但是最后真正的接受者只有一个”, 这时候请求发送者与接受者的耦合有可能出现“变化脆弱”的症状,职责链的目的就是蒋三著解耦,从而更好地应对变化。

  应用了Chain of Responsibility模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加/修改请求的处理职责。

  如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的缺省机制。这也是每个接受对象的责任,而不是发出请求的对象的责任。

23种设计模式(二十一)数据结构之职责链相关推荐

  1. 23种设计模式(十一)外观模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  2. 23种设计模式(11):责任链模式

    定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 类型:行为类模式. 类图: 首先来看一段代码: p ...

  3. 23种设计模式之行为型(下)

    23种设计模式之行为型(下) 责任链模式(Chain of Responsebility ) 命令模式(Command) 备忘录模式(Memento) 解释器模式(Interpreter) 迭代器模式 ...

  4. 设计模式(二)23种设计模式

    设计模式(二)23种设计模式 文章目录 设计模式(二)23种设计模式 组件协作模式 策略模式 观察者模式 单一职责模式 Decorator模式 Bridge模式 对象创建模式 Factory Meth ...

  5. 23种设计模式-个人笔记(二)

    目录 五.23 种设计模式 1.单例模式 1.1.单例模式的定义与特点 1.2.单例模式的优点和缺点 1.3.单例模式的应用场景 1.4.单例模式的结构与实现 1.5.八种方式详解 1.6.单例模式在 ...

  6. 23种设计模式 UML 类图及对应示例代码 (二)

    23种设计模式 UML 类图及对应示例代码 (二) 11.DoFactory.GangOfFour.Flyweight.Structural Flyweight:运用共享技术有效的支持大量细粒度的对象 ...

  7. 23种设计模式(二十三)访问者模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  8. 23种设计模式(二十二)状态模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  9. 【设计模式】Java 23种设计模式对比总结

    一.设计模式的分类 创建型模式,共五种(1-5):工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种(6-12):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  10. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

最新文章

  1. 阿里云开发者大会:资源加应用酝酿云存储变局
  2. leetcode 292. Nim Game | 292. Nim 游戏(DP->数学推理)
  3. 从小一看到数字,脑子里就开始搞颜色......
  4. 图像分割-二阶导数零交叉点的含义
  5. linux6添加chkconfig管理,10、14 Linux系统服务管理工具-chkconfig
  6. 倒计时css和js html代码,手把手教你利用CSS和JS创建一个倒数计时器
  7. python 爬虫,起点完结榜前100榜单
  8. Citrix Bypass总结
  9. [20180801]insert导致死锁.txt
  10. Hadoop权威指南(第三版)笔记——MapReduce
  11. ASP.NET 发送电子邮件 smtp
  12. linux syscall 内核系统调用API接口
  13. 【HiFlow】新型零代码自动化助手
  14. 教大家pr如何新建工程文件
  15. 利用pyecharts绘制新浪微博传播图(文末附完整代码地址)
  16. 如何不出门就可以看遍中国各个城市的美景?
  17. konfig:采用ConfigMap实现线上配置热更新
  18. 二叉树遍历的非递归实现
  19. 无法定位程序输入点 except_电脑定时程序
  20. 【毕业设计源码】基于微信小程序的校园活动管理系统的设计与实现

热门文章

  1. ExtJs4 笔记(12) Ext.toolbar.Toolbar 工具栏、Ext.toolbar.Paging 分页栏、Ext.ux.statusbar.StatusBar 状态栏...
  2. L2TP 配置实例——Client-Initiated
  3. Access Modify Change 三种时间戳详解
  4. Selenium3笔记-WebDriver源码初探
  5. 【树状数组】【P3608】平衡的照片
  6. 相反数-网易校招编程题
  7. 爱创课堂每日一题第四十八天- html5有哪些新特性、移除了那些元素?
  8. [LeetCode]50.Pow(x, n)
  9. CompareDateTime、CompareDate、CompareTime、SameDateTime、SameDate、SameTime - 对比时间的函数...
  10. Android核心模块内容概述