设计模式之(十四)责任链模式(Chain of Responsibility)
在业务场景中,有很多是需要审批的。审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的。
责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系。讲这些对象连成一条链,并沿着这条链传送这个请求,直到有一个对象处理他为止。
责任链模式的思想就是把处理请求的处理都拆开,一个处理逻辑封装成一个小颗粒类,在需要使用的时候就可以按照业务需要排序起来处理,就像一个链条。但是在这个过程中可能走完了也没有得到处理,这就需要给出一个默认的处理,而给出处理结果。接下来看看此模式的类图:
从这个图里可以看出来,这个模式和递归算法很大关系,接下来通过一个例子来加深对此模式的理解。
/***
* 处理类的抽象类
* @author pwq
*/
public abstract class Handle {
protected Handle successor = null; public void setSuccessor(Handle successor) {
this.successor = successor;
} public abstract String handleFeeRequest(String user,double fee); } /***
* 其中一个处理逻辑类
* @author pwq
*/
public class ProjectManager extends Handle { @Override
public String handleFeeRequest(String user, double fee) {
// TODO Auto-generated method stub
String str ="" ;
if(fee < 500){
if("小李".equals(user)){
str = "项目经理同意"+user+"申请的聚餐费用 "+ fee +" 元";
}
else{
str = "项目经理不同意"+user+"申请的聚餐费用 "+ fee +" 元";
}
}
else{
if(successor != null)
str = successor.handleFeeRequest(user, fee);
}
return str;
}
}
/***
* 处理逻辑类
* @author pwq
*
*/
public class DeptManager extends Handle { @Override
public String handleFeeRequest(String user, double fee) {
// TODO Auto-generated method stub
String str ="" ;
if(fee < 1000){
if("小李".equals(user)){
str = "部门经理同意"+user+"申请的聚餐费用 "+ fee +" 元";
}
else{
str = "部门经理不同意"+user+"申请的聚餐费用 "+ fee +" 元";
}
}
else{
if(successor != null)
str = successor.handleFeeRequest(user, fee);
}
return str;
}
}
DeptManager 处理逻辑类
public class GeneralManager extends Handle { @Override
public String handleFeeRequest(String user, double fee) {
// TODO Auto-generated method stub
String str ="" ;
if(fee >= 1000){
if("小李".equals(user)){
str = "总经理同意"+user+"申请的聚餐费用 "+ fee +" 元";
}
else{
str = "总经理不同意"+user+"申请的聚餐费用 "+ fee +" 元";
}
}
else{
if(successor != null)
str = successor.handleFeeRequest(user, fee);
}
return str;
}
}
GeneralManager 处理逻辑类
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
Handle h1=new ProjectManager();
Handle h2 = new DeptManager();
Handle h3 = new GeneralManager(); h1.setSuccessor(h2);
h2.setSuccessor(h3); String str = h1.handleFeeRequest("万小弟", 600);
System.out.println(str);
String str2 = h1.handleFeeRequest("彭大哥", 1800);
System.out.println(str2);
String str3 = h1.handleFeeRequest("小李", 400);
System.out.println(str3);
}
} /*****************************************************/ 部门经理不同意万小弟申请的聚餐费用 600.0 元
总经理不同意彭大哥申请的聚餐费用 1800.0 元
项目经理同意小李申请的聚餐费用 400.0 元
通过这个例子分析处理类的写法,如果从抽象类来看的话,就是递归算法来达到让每个逻辑都有机会处理请求的。要类里面要定义下个环节处理的逻辑类变量,在使用的时候通过这个设置来组成处理的链。
例子展示的是责任链,也就是典型的审批的流程这样场景。还有另外一种用法,就是功能链,功能链就是把从多功能拆分到单一功能类中,可以根据需要来调用,相对来说更灵活,也便于复用。
责任链的有点和缺点
优点就是:
1、把复杂功能拆分处理,让每个类只是负责一个处理逻辑。复用性更好,组合更加灵活。
2、请求和处理类分开,实现低耦合,更加利于扩展。
缺点:小颗粒类大幅膨胀。
模式的本质
分离职责,动态组合
设计模式之(十四)责任链模式(Chain of Responsibility)的更多相关文章
- 设计模式之二十:责任链模式(Chain of Responsibility)
感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...
- 设计模式学习总结(十)责任链模式(Chain Of Responsibility)
责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发! 一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...
- 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...
- 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
- 责任链模式-Chain of Responsibility(Java实现), 例2
责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...
- 责任链模式-Chain of Responsibility(Java实现), 例1
责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...
- 《JAVA设计模式》之责任链模式(Chain of Responsibility)
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
随机推荐
- Codeforces F. Maxim and Array(构造贪心)
题目描述: Maxim and Array time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- Transformer模型---encoder
一.简介 论文链接:<Attention is all you need> 由google团队在2017年发表于NIPS,Transformer 是一种新的.基于 attention 机制 ...
- Qt工程管理
Qt Creator工程管理Qt Creator以工程项目的方式对源码进行管理一个Qt Creator工程包含不同类型的文件 .pro项目描述文件.pro.user用户配置描述文件 //由Qt Cre ...
- 201871010101-陈来弟《面向对象程序设计(Java)》第十一周学习总结
201871010101-陈来弟<面向对象程序设计(Java)>第十一周学习总结 实验九 泛型程序设计技术 实验时间 2019-11-8 第一部分:理论基础知识 1.什么是泛型类 泛型是 ...
- UiPath:Delay延迟执行,解决UiPath自动输入值不完整问题
学习过程中出现点击按钮后,由于网页弹出框显示速度慢,造成输入值遗漏或者根本就没有输入问题. 查阅了一下,目前解决方法是在点击按钮后加一段延迟时间,等待他显示完整在输入值.如图 时间格式以秒为单位 00 ...
- jQuery的DataTables中的TableTools的基本使用
DataTables的TableTools插件提供复制,导出excel.pdf,打印等功能. DataTables官网:http://datatables.net TableTools示例:http: ...
- echars vue 封装全局组件 曲线 柱状图 同v-chars绿色系 配置样式
Echars vue封装 ,曲线图 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 使用 SQLContext 可以从现有的 RDD 或数据源创建 DataFrames 报错?
报错情况: 解决方法: SQLContext可能需要自己创建. 所以,先运行var sqlContext=new org.apache.spark.sql SQLContext(sc).即可. 之后再 ...
- AOP的理解与实现
AOP:面向切面编程,在不破坏原有代码的情况下,提供新的功能.可以使用AOP添加通用功能,比如事务.日志.权限.异常.缓存... 常见的AOP:MVC中的过滤器.HttpModule... 如何实现A ...
- js 加载并解析Markdown文档
网上有很多网站会通过.md文档来做页面内容(比如,阮一峰老师的es6入门blog: http://es6.ruanyifeng.com/),很好奇,这是怎么做的?(至于.md是什么,或许(https: ...