楔子

小七的朋友最近在看springSecurity的源码,说是里面大量使用了责任链模式,感觉阅读起来有些吃力,正好小七在总结设计模式,希望用这篇文章让小七的朋友和读者们能够了解责任链模式。

代码实现

责任链,听着是个很唬人的词,实际上联系生活场景,到处都是他的体现。非常有代表性的就是请假流程,比如你请一个假必须要经过一系列校验,先得有请假原因,还得有请假天数,我们基于这个业务场景,给出以下代码实现。

任务类

public class Task {/*** 任务名称*/String name;/*** 申请天数*/String applyDays;/*** 原因*/String cause;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getApplyDays() {return applyDays;}public void setApplyDays(String applyDays) {this.applyDays = applyDays;}public String getCause() {return cause;}public void setCause(String cause) {this.cause = cause;}@Overridepublic String toString() {return "Task{" +"name='" + name + '\'' +", applyDays='" + applyDays + '\'' +", cause='" + cause + '\'' +'}';}
}

抽象的任务处理器

public abstract class AbstractTaskHandler {/*** 责任链模式特点之一:包含自己,方便子类可以直接使用*/protected AbstractTaskHandler abstractTaskHandler;/*** 责任链模式特点之一:set方法,方便设置下一个链条** @param abstractTaskHandler 抽象处理器*/public void setNextTaskHandler(AbstractTaskHandler abstractTaskHandler) {this.abstractTaskHandler = abstractTaskHandler;}/*** 申请,交给子类实现*/public abstract void apply(Task task);
}

原因处理器

public class CauseHandler extends AbstractTaskHandler {@Overridepublic void apply(Task task) {if (StringUtils.isNotEmpty(task.getCause())){System.out.println(task.getName()+"申请原因不为空,流转下一步校验");// 这里的非空判断是为了使得链中各节点可以相互替换if (abstractTaskHandler != null){abstractTaskHandler.apply(task);}}else{System.out.println(task.getName()+"申请原因为空,申请不通过");}}
}

申请天数处理器

public class ApplyDaysHandler extends AbstractTaskHandler {@Overridepublic void apply(Task task) {if (StringUtils.isNotEmpty(task.getApplyDays())){System.out.println(task.getName()+"申请天数不为空,流转下一步校验");// 这里的非空判断是为了使得链中各节点可以相互替换if (abstractTaskHandler != null){abstractTaskHandler.apply(task);}}else{System.out.println(task.getName()+"申请天数为空,申请不通过");}}
}

测试类

public class Test {public static void main(String[] args) {//============组装任务============//Task task = new Task();task.setName("请假任务");task.setCause("回老家结婚");task.setApplyDays("10天");//============组装责任链============//CauseHandler causeHandler = new CauseHandler();ApplyDaysHandler applyDaysHandler = new ApplyDaysHandler();causeHandler.setNextTaskHandler(applyDaysHandler);//============调用申请方法============//causeHandler.apply(task);}
}

结果

UML类图

【责任链模式】责任链模式原来如此简单相关推荐

  1. golang 责任链模式(链式调用)

    golang 链式调用 文章目录 golang 链式调用 前言 一.什么是「责任链模式」? 二.「责任链模式」的具体优势 三.代码案例 search.go orders.go 总结 前言 我们在写go ...

  2. 设计模式 — 行为型模式 — 责任链模式

    目录 文章目录 目录 责任链模式 应用场景 代码示例 责任链模式 责任链模式,将多个处理方法连接成一条链条,请求将在这条链条上流动直到该链条中有一个节点可以处理该请求.通常这条链条是一个对象包含对另一 ...

  3. 设计模式学习笔记——责任链(Chain of Responsibility)模式

    设计模式学习笔记--责任链(Chain of Responsibility)模式 @(设计模式)[设计模式, 责任链模式, chain of responsibility] 设计模式学习笔记责任链Ch ...

  4. 设计模式--常用8个设计模式 单例-策略-责任链-装饰者-迭代器模式-观察者模式-常用设计模式

    1创建型的设计模式-主要有单例模式和工厂模式 对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题 2结构型的设计模式-主要有代理模式和适配 ...

  5. 设计模式-行为型模式-责任链模式

    设计模式-行为型模式-责任链模式 定义 将请求沿着链传递,然后直到对象处理即可. UML图 代码 基本的责任链 public class Test{public void test(int i, Re ...

  6. 责任链模式与策略模式

    责任链模式 Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间 ...

  7. 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式

    前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...

  8. 责任链模式(职责链模式)(Chain of Responsibility Pattern)

    学校OA 系统的采购审批项目:需求是 采购员采购教学器材 如果金额小于等于5000, 由教学主任审批(0<=x<=5000) 如果金额小于等于10000, 由院长审批(5000<x& ...

  9. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  10. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

最新文章

  1. LeetCode简单题之词典中最长的单词
  2. ueditor编辑器和at.js集成
  3. 在linux下修改用户密码
  4. 美国人工智能就业市场全景:开放职位512个,基本工资最高26万美元
  5. 手把手教你写ORM(三)
  6. javase基础复习攻略《三》
  7. Qt 【widget如何铺满窗口】
  8. Pandas CookBook -- 04选取数据子集
  9. java:Eclipse插件springsource-tool-suite的下载和安装
  10. 在Hyper-V主机中支持VLAN
  11. 敏捷开发用户故事系列之五:用户故事的分类
  12. C盘不能新建文件的问题解决办法
  13. Android通过Wifi来调试你的应用
  14. OSG 集群渲染 cluster render 支持 Cave 和 powerwall 模式
  15. HTML超链接怎么设置下拉菜单,html超链接怎么设置
  16. 「云服务」华为云云耀云服务器介绍
  17. 买保险选大公司还是小公司?
  18. 平安夜吃苹果想起的事
  19. Hydra – Brute Force HTTP(S)
  20. 感性负载产生负压的影响分析

热门文章

  1. Win32API UNICODE编码宽字节
  2. “广告电商”到底是什么?广告收益模式是否行得通?
  3. vue中 给元素添加鼠标移入,鼠标移出的效果的事件
  4. oracle大数据量删除方案
  5. maven中多个子模块的构建顺序
  6. uniapp 图标配置
  7. mysql limit 0_MySQL 8.0 关于LIMIT的知识点理解
  8. dllhell 听说过吗?_您已经听说过X25519,但是X448有何特别之处?
  9. Ubuntu查看系统信息(CPU、GPU信息)
  10. python-异常处理_异常类型_处理的异常的方法