在业务场景中,有很多是需要审批的。审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的。

  责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系。讲这些对象连成一条链,并沿着这条链传送这个请求,直到有一个对象处理他为止。 

  责任链模式的思想就是把处理请求的处理都拆开,一个处理逻辑封装成一个小颗粒类,在需要使用的时候就可以按照业务需要排序起来处理,就像一个链条。但是在这个过程中可能走完了也没有得到处理,这就需要给出一个默认的处理,而给出处理结果。接下来看看此模式的类图:

从这个图里可以看出来,这个模式和递归算法很大关系,接下来通过一个例子来加深对此模式的理解。

 /***
* 处理类的抽象类
* @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)的更多相关文章

  1. 设计模式之二十:责任链模式(Chain of Responsibility)

    感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...

  2. 设计模式学习总结(十)责任链模式(Chain Of Responsibility)

    责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发!   一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...

  3. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  4. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  5. 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...

  6. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  7. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  8. 责任链模式-Chain of Responsibility(Java实现), 例2

    责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...

  9. 责任链模式-Chain of Responsibility(Java实现), 例1

    责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...

  10. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

随机推荐

  1. fatal error C1083: 无法打开包括文件: “Halcon.h”: No such file or directory

    这个文件是有包括的.但编译时报错. 解决方法:我把debug模式改为release模式就好了.

  2. 201871010128-杨丽霞《面向对象程序设计(java)》第十五周学习总结

    201871010128-杨丽霞<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  3. plantUML 安装

    plantUML 安装 资源 http://www.graphviz.org/ https://graphviz.gitlab.io/_pages/Download/windows/graphviz- ...

  4. 洛谷 P1182 数列分段 Section II

    洛谷 P1182 数列分段 Section II 洛谷传送门 题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. ...

  5. 测开面试 | Python常问算法

    1.排序 从小到大排序:sorted(list) 从大到小排序:sorted(list, reverse=True) sort() 方法,改变原有数组的顺序 sort(reverse=True) #! ...

  6. 【转】spring的AOP原理,使用场景是什么?

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  7. [LeetCode] 287. Find the Duplicate Number 寻找重复数

    Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro ...

  8. [LeetCode] 253. Meeting Rooms II 会议室之二

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  9. [LeetCode] 37. Sudoku Solver 求解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy  ...

  10. C++版本 ORM 访问数据库之ODB 的oracle Demo测试(二)

    有上篇文章已经说了odb的环境编译, 现在直接拿来给的例子进行数据库的增删改查操作测试 1. ODB访问oracle数据库_ 插入操作(insert) 直接运行上篇编译好的exe文件会出现如下错误 错 ...