【设计模式-责任链模式】
时间:2022-07-24
本文章向大家介绍【设计模式-责任链模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【导读】当有问题需要请教时,咨询别人,当其处理不了的时候,就咨询另外一个人,直到有人能处理此问题。这个就是典型的责任链模式。
一、定义
为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
二、实例
比如日常报销流程,一般流程是先填写报销单,然后直系领导审批,通过之后是财务部审批。如果有一层审批不通过,则直接打回。
报销单对象:
public class ExpenseAccount {
//发票
private String invoice;
//报销单
private String expenseAccount;
public ExpenseAccount(String invoice, String expenseAccount) {
this.invoice = invoice;
this.expenseAccount = expenseAccount;
}
}
抽象审批者:
public abstract class Approver {
protected Approver approver;
1、设置下一个审批者
public void setNextApprover(Approver approver){
this.approver = approver;
}
2、判断是否有下一个审批人
public boolean hasNextApprover(){
if (null == approver) {
return false;
}
return true;
}
abstract void doApprover(ExpenseAccount expenseAccount);
}
直系领导审批:
public class DirectLeaderApprover extends Approver {
@Override
public void doApprover(ExpenseAccount expenseAccount) {
if (!StringUtils.isEmpty(expenseAccount.getInvoice())
&& !StringUtils.isEmpty(expenseAccount.getExpenseAccount())) {
System.out.println("直系领导审批通过");
if (hasNextApprover()) {
getNextApprover().doApprover(expenseAccount);
}else {
System.out.println("报销成功,流程结束");
}
} else {
System.out.println("直系领导审批不通过,流程结束");
}
}
}
财务部审批:
public class AccountingApprover extends Approver {
@Override
public void doApprover(ExpenseAccount expenseAccount) {
if (!StringUtils.isEmpty(expenseAccount.getInvoice()) && !StringUtils.isEmpty(expenseAccount.getExpenseAccount())) {
System.out.println("财务部审批通过");
if (hasNextApprover()) {
getNextApprover().doApprover(expenseAccount);
}else {
System.out.println("报销成功,流程结束");
}
} else {
System.out.println("财务部审批不通过,流程结束");
}
}
}
测试类:
public static void main(String[] args) {
Approver directLeader = new DirectLeaderApprover();
Approver accounting = new AccountingApprover();
directLeader.setNextApprover(accounting);
ExpenseAccount expenseAccount = new ExpenseAccount("发票","报销单");
directLeader.doApprover(expenseAccount);
}
运行结果:
三、源码实例
(1)JDK的过滤器Filter就是典型的过滤器模式
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
- 【web必知必会】——图解HTTP(上)
- 【web必知必会】—— 图解HTTP(下)
- 【Spring实战】—— 14 传统的JDBC实现的DAO插入和读取
- 【AngularJS】—— 4 表达式
- 【AngularJS】—— 5 表单
- 【AngularJS】—— 1 初识AngularJs
- 【AngularJS】—— 2 初识AngularJs(续)
- 【AngularJS】—— 3 我的第一个AngularJS小程序
- 【Spring实战】—— 2 构造注入
- 共享单车运维“朋友圈”越来越宽,乱停乱放现象有望改善吗?
- 【Spring实战】—— 15 Spring JDBC模板使用
- 前端开发总览
- 【Spring实战】—— 16 基于JDBC持久化的事务管理
- 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux中如何查询运行文件的全路径的方法
- 基于可变自动编码器(VAE)的生成建模,理解可变自动编码器背后的原理
- Centos7上网及添加静态IP方法介绍
- 解决yum安装报错Protected multilib versions的问题
- Linux与Windows编码不一致的解决方案
- Linux运维之如何使用ss命令代替netstat
- 对Linux终端使用socks5代理的方法详解
- linux安装xmind的方法步骤
- 对linux下软件(库)的更新命令详解
- Linux环境下Apache服务器配置二级域名的方法详解
- Linux环境下Apache开启https服务的方法详解
- 使用GANs生成时间序列数据:DoppelGANger论文详解
- CentOS 7使用samba共享文件夹的完整步骤
- Linux环境使用crontab命令设置定时周期性执行任务【含php执行代码】
- linux系统报xfs_vm_releasepage警告问题的处理方法