设计模式之(十四)责任链模式(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)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
随机推荐
- 201871010125 王玉江《面向对象程序设计(java)》第十三周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 快速安装Rainbond——开源企业级Paas平台
快速安装Rainbond--开源企业级Paas平台 参考:https://www.rainbond.com/docs/user-operations/install/online_install/ R ...
- dateNode 启动不了
dateNode 启动不了 进去路径中找到 name和data文件夹,current下面分别有 一个 version文件,打开发现两个clusterId都不一样 把name和data文件里面的ver ...
- electron 创建托盘应用
在Electron中我们创建一个托盘需要如下几个文件: 1. main.js 用来存放应用代码.2. 一张PNG格式的图片用作应用图标.3. 一个package.json文件用来描述应用配置. 下面是 ...
- File.createNewFile和 File.createTempFile比较和区别
原文地址:http://wzhiju.iteye.com/blog/1119037 最近,在看代码时看到了一个方法, File.createTempFile() ,由此联想到File.createNe ...
- cookie清除及其他操作
JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 一:设置co ...
- 【洛谷1829】 [国家集训队] Crash的数字表格(重拾莫比乌斯反演)
点此看题面 大致题意: 求\(\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\). 推式子 不会莫比乌斯反演的可以先去看这篇博客:初学莫比乌斯反演. 反演题显然就是推式子啊~~~ 考 ...
- [LeetCode] 24. Swap Nodes in Pairs 成对交换节点
Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...
- oracle--oracle18C DG搭建(二)
配置清单 任务 数据库 创建主数据库数据文件的备份副本 主 为备用数据库创建控制文件 主 为备用数据库创建参数文件 主 将文件从主系统复制到备用系统 主 设置环境以支持备用数据库 备库 启动物理备用数 ...
- navicat 11.2.7破解
1,软件安装包目录 2,根据电脑系统安装x64或者x86,安装完成之后将PatchNavicat.exe放到navicat的安装目录下 3,右键以管理员身份运行PatchNavicat.exe,或者双 ...