文章目录

  • 一、基本概念
    • 1.定义
    • 4.类似背景举例
    • 3.要点
  • 二、结构图
  • 三、实例说明
    • 1.普通代码
    • 2.责任链代码

一、基本概念

1.定义

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

4.类似背景举例

请求流程,1 天内需要主程序批准,3 天内需要项目经理批准,3 天以上需要老板批准;

3.要点

①解耦请求方和处理方,请求方不知道请求是如何被处理,处理方的组成是由相互独立的子处理构成,子处理流程通过链表的方式连接,子处理请求可以按任意顺序组合。
②责任链请求强调请求最终由一个子处理流程处理;通过了各个子处理条件判断。
③责任链扩展就是功能链,功能链强调的是,一个请求依次经由功能链中的子处理流程处理。
④将职责以及职责顺序运行进行抽象,那么职责变化可以任意扩展,同时职责顺序也可以任意扩展。

二、结构图


HandleA和 HandleB是通过指针的指向低度耦合的。结构图一开始看不太懂,但是等代码懂了再来看结构图就恍然大悟了。

三、实例说明

1.普通代码

比如说我们需要模拟公司里的请假批准模式,先给上一层领导递请假条,一层领导没权利批准的话再向上一层递交…
普通代码:

#include<iostream>
#include <string>
using namespace std;class Context {public:std::string name;int day;
};class LeaveRequest {public:// 随着判断的增加,LeaveRequest类变得不稳定bool HandleRequest(const Context& ctx) {if (ctx.day <= 1)return HandleByMainProgram(ctx);else if (ctx.day <= 3)return HandleByProjMgr(ctx);elsereturn HandleByBoss(ctx);}private:bool HandleByMainProgram(const Context& ctx) {cout << "主程序批准" << endl;return true;}bool HandleByProjMgr(const Context& ctx) {cout << "项目经理批准" << endl;return true;}bool HandleByBoss(const Context& ctx) {cout << "老板批准" << endl;return true;}
};int main()
{LeaveRequest LR;Context A;A.name = "xiaohua";A.day = 1;LR.HandleRequest(A);Context B;B.name = "xiaomeng";B.day = 3;LR.HandleRequest(B);return 0;
}

普通代码缺点:所有的人和处理方式都被封装到一个类里面,而且如果有人的职责发生变化(比如项目经历的权力 扩大到可以批10天的假),那么我们就需要去修改这一整个类。除此之外,如果以后新增加职位(比如如果新增老板秘书,项目经理秘书可以批准假期请求的话),那么我们也需要在原来的大类中修改增加代码。显然违背了开闭原则,而且由于在一个类里卖弄,所以耦合度极高。可以通过类比现实中层层上报的实际情况结合链表使用的方式解决这个问题,即责任链模式。

2.责任链代码

责任链模式代码:

#include<iostream>
#include <string>
using namespace std;class Context {public:string name;int day;
};class IHandler {public:void SetNextHandler(IHandler* Handler){this->next = Handler;}bool Handler(const Context& ctx) {//能批准就自己批准if (CanHandler(ctx)) {return HandlerRequest(ctx);}//不能批准就递交给上面领导else if(GetNextHandler()){return GetNextHandler()->Handler(ctx);}//到了最顶层,仍然没人批准else {cout << "你的假期无人批准" << endl;  //or  other}return false;}virtual ~IHandler() {}
protected:virtual bool HandlerRequest(const Context& ctx) = 0;virtual bool CanHandler(const Context& ctx) = 0;IHandler* GetNextHandler() {return this->next;}
private:IHandler* next;
};//1天的假期直接在主程序中批准
class HandlerByMainProgram :public IHandler{public:bool CanHandler(const Context& ctx) {return ctx.day <= 1;}bool HandlerRequest(const Context& ctx) {cout << "主程序批准" << endl;return true;}};//2-3天的假期项目经理批准
class HandlerByProjMgr :public IHandler {public:bool CanHandler(const Context& ctx) {return ctx.day >= 2 && ctx.day <= 3;}bool HandlerRequest(const Context& ctx) {cout << "项目经理批准" << endl;return true;}
};//4-20的假期需要老板批准
class HandlerByBoss :public IHandler {public:bool CanHandler(const Context& ctx) {return ctx.day >= 4 && ctx.day <= 20;}bool HandlerRequest(const Context& ctx) {cout << "老板批准" << endl;return true;}
};//30天以内的假期,老板秘书都可以批准
class HandlerBySecretary :public IHandler{public:bool CanHandler(const Context& ctx) {return ctx.day <= 30;}bool HandlerRequest(const Context& ctx) {cout << "秘书处理了你的假期" << endl;return true;}
};int main()
{IHandler* H0 = new HandlerByMainProgram();IHandler* H1 = new HandlerByProjMgr();IHandler* H2 = new HandlerByBoss();IHandler* H3 = new HandlerBySecretary();//连接顺序可以打乱,只不过正常来说,都是有一定要求的//比如说公司请假制度,一般先小组组长批,如果在小组组长权限外,再层层向上申报//如果公司有严格的请假制度,对于请假来说,顺序打乱不影响最终是否被批准,但是会改变批准的人//比如如果秘书在第一个的话,那么在这里所有能批准的假都将由秘书批准(因为30天以内的假秘书都可以批准)//但是往往权力大的人会先让手下人解决事情,他解决手下解决不掉的事情H0->SetNextHandler(H1);H1->SetNextHandler(H2);H2->SetNextHandler(H3);Context A;A.name = "xiaomeng";A.day = 2;H0->Handler(A);Context B;B.name = "xiaohua";B.day = 15;H0->Handler(B);Context C;C.name = "xiaopang";C.day = 40;//暂时没有处理40天假期的操作H0->Handler(C);return 0;
}

运行结果:

可以看见,把不同的领导之间给解耦了,没有完全解耦,通过链表的方式隐式联系,这种方式使得她们之间耦合度大大降低,一个领导的权力变化不需要修改其他领导的代码。

设计模式——责任链模式相关推荐

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

    Java设计模式-责任链模式,我想这是值得你了解一下下的啦. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持 ...

  2. 设计模式--责任链模式--Java实现

    设计模式–责任链模式–Java实现 责任链模式–链式数据结构–内存消耗–Java的awt事件一开始用责任链模式后来改为观察者模式–为什么呢?–现在的应用–dom事件–异常处理机制-过滤器链–等等 学习 ...

  3. 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器

    理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式 1. 开闭.单一职责.里氏替换.接口隔离等设计原则 2. 随处可见的模板方法 3. nginx中核心设计模式 责任链模式 4. 责 ...

  4. java责任链模式审批请假_Java设计模式-责任链模式

    Java设计模式-责任链模式 Java版本:jdk1.8 IDE:IDEA 一 前言 本文介绍责任链模式以及Java下的实现. 二 概念 1.什么是责任链模式 责任链模式(Chain of Respo ...

  5. 一起学设计模式 - 责任链模式

    责任链模式(ChainOfResponsibilityPattern)属于 行为型模式的一种,将请求沿着一条链传递,直到该链上的某个对象处理它为止. 概述 定义如下:一个请求有多个对象来处理,这些对象 ...

  6. 大话设计模式—责任链模式

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

  7. 设计模式 责任链模式

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

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

    最近重构代码发现责任链模式非常实用,所以简单总结了一下.总体来说,责任链模式更像是一种简化多种场景下调用处理的一种设计模式,特别适合if-else分支判断很多的场景.比如是根据不同会员等级给予不同的优 ...

  9. 深入理解设计模式-责任链模式(职责链模式)

    文章目录 一.定义 二.使用场景 三.代码样例 1.需求 2.设计一个所有处理器都要实现的接口 3.实现各种处理器 4.客户端 5. 输出 四.要点与优缺点 结尾 一.定义 避免请求发送者与接收者耦合 ...

  10. 工作中常用的设计模式 -- 责任链模式

    一般做业务开发,不太容易有大量使用设计模式的场景.这里总结一下在业务开发中使用较为频繁的设计模式.当然语言为 Java,基于 Spring 框架. 1 责任链模式(Chain of Responsib ...

最新文章

  1. java具有自动无用内存回收_Java语言程序设计(一)试卷及答案解释
  2. 启动tomcat报StandardServer.await: create[8005] 故障解决
  3. ICMP隧道工具ptunnel
  4. Oracle执行SQL语句的过程
  5. Android-电话录音服务
  6. 分享2018年陆陆续续读过的书-附书单
  7. Linux中的MAN命令
  8. Effective Java~58. for-each 循环优先于传统的for 循环
  9. java实现缓存中间件,Redis,分布式系统中不可少的缓存中间件
  10. logstash同步数据到es
  11. Android 8.0学习(16)---8.0 的Doze模式白名单路径
  12. Extjs5.0 学习之路【资源篇】
  13. sql backup database备份d盘_Oracle-备份与恢复(二)RMAN备份-自动备份计划任务脚本...
  14. 写给自己的23条好习惯
  15. 微机原理8086汇编语言上机——Masm环境搭建与常用汇编调试指令
  16. DefaultApplication_Snoop
  17. 计算机无法关机 总是自动启动不了怎么办,电脑不能关机,小编教你电脑关机后总是重启怎么办...
  18. 手游平台开发怎么做?
  19. HTML基础的回顾复习(基本标签,简单的一个登陆验证)
  20. [Shoi2007]Bookcase 书柜的尺寸 dp

热门文章

  1. [基础题] 6.(*)按如下要求编写Java程序: (1)编写一个接口:OneToN,只含有一个方法int dispose(int n)
  2. 网络安全-NTFS权限和445文件共享
  3. msf与cs互相传动
  4. C# 网络编程之最简单浏览器实现
  5. HarmonyOS之跨设备分布式应用调试
  6. LeetCode Algorithm 剑指 Offer 28. 对称的二叉树
  7. 彻底掌握动态规划,第一节
  8. P1111 修复公路
  9. 征战蓝桥 —— 2016年第七届 —— C/C++A组第3题——方格填数
  10. Linux(五) 权限