设计模式之(十四)责任链模式(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)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
随机推荐
- JS高阶---作用域与作用域链
大纲: 主体: (1)概论 (2)层级 执行上下文层级为n+1原则 作用域层级也是n+1原则 验证: (3)函数作用域作用 隔离变量,不同作用域下,相同变量名不会有冲突 (4) .
- springcloud注解解释
@SpringBootApplication是springboot启动类,包括三个注解,他们的作用分别是: @Configuration:表示将该类作用springboot配置文件类 @Enabl ...
- 10-numpy笔记-np.random.randint
b_idx = np.random.randint(0, 9, 90) >>> b_idx array([0, 1, 5, 4, 7, 2, 7, 0, 0, 4, 2, 2, 3, ...
- Ubuntu16.04安装deb包
在Ubuntu下安装deb包需要使用dpkg命令.Dpkg 的普通用法: 1.sudo dpkg -i <package.deb> 安装一个 Debian 软件包,如你手动下载的文件. 2 ...
- css样式添加错误导致烦扰
省厅和市州 两个ul 之间切换 分别能显示两者对应的内容 但是在做过程中,出现省厅界面有市州的内容… 找了半天,发现是css的问题 layui-show的多添加 算是把首页内容的任务解决了至于c ...
- Xamarin.Forms移动开发系列3:项目剖析
摘要 本文主要进行Xamarin.Forms应用程序剖析. 前言 本文介绍Xamarin.Forms应用程序剖析. 由于本系列重点研究对象为Xamarin.Forms,所以对Xamarin.Andro ...
- 7.29 NOIP模拟测试10 辣鸡(ljh)+模板(ac)+大佬(kat)
T1 辣鸡(ljh) 就是一道分类讨论的暴搜,外加一丢丢的减枝,然而我挂了,为啥呢,分类讨论变量名打错,大于小于号打反,能对才怪,写了sort为了调试就注释了,后来忘了解开,小减枝也没打.但是这道题做 ...
- Vue实际中的应用开发【分页效果与购物车】
作者 | Jeskson 来源 | 达达前端小酒馆 分页组件 首先来创建项目: 分页组件,做项目不要写动手写代码,要想想业务逻辑,怎么写,如何写才是最好的呈现方式,做项目不急,要先想好整体的框架,从底 ...
- [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 ...
- makfile通用版本
DIR_INC = ./include DIR_SRC = ./src DIR_OBJ = ./obj DIR_BIN = ./bin LIBS += -Wl,-rpath=../lib/HCNetS ...