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

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

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

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

 /***
* 处理类的抽象类
* @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. TensorFlow GPU版本的安装与调试

    笔者采用python3.6.7+TensorFlow1.12.0+CUDA10.0+CUDNN7.3.1构建环境 PC端配置为GTX 1050+Intel i7 7700HQ 4核心8线程@2.8GH ...

  2. Ubuntu 16.04/18.04 右键创建新建文件

    刚刚安装完新的Ubuntu系统后不能直接右键创建新的文件,那么怎么做呢 办法: 打开终端,cd 切换到 Templates文件夹下,然后输入: sudo gedit text 这样就在Template ...

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

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

  4. shell脚本特殊符号——单引号、双引号、反引号、反斜杠

    1. 单引号 ( '' ) 被单引号用括住的内容,将被视为单一字串. 2. 双引号 ( " " )  被双引号用括住的内容,将被视为单一字串.双引号只要求忽略大多数,具体说,括在双 ...

  5. java执行hive命令或者脚本

    java执行脚本 import java.io.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import ja ...

  6. Azure产品整理

    Azure的文档真是够落地,简明易懂. 计算 Linux 虚拟机:为 Ubuntu.Red Hat 等预配虚拟机 Windows 虚拟机 为 SQL Server.SharePoint 等预配虚拟机 ...

  7. SQL Server 迁移数据库 (一)导入和导出

    今天正好换服务器,记录一下迁移数据库的过程. 以前经常用备份还原法,今天试试‘SQL Server 2016 导入和导出数据’这个看怎么玩. 1. 建数据库结构 1.1 在需要迁移的数据库名字上右击, ...

  8. SWA2G422&485JK2G基础篇: STM32+W5500实现MQTT通信控制,485/422透传通信

    说明 这节实现的功能: STM32+W5500实现MQTT通信控制 细节功能: 1.DHCP动态获取IP 2.DNS域名解析 3.网口<--MQTT-->485/422透传通信 测试准备工 ...

  9. 【转】jsp 页面 按回车键 触发事件

    转载: https://blog.csdn.net/ludongshun2016/article/details/59536779. 第一种: <script type="text/J ...

  10. [LeetCode] 527. Word Abbreviation 单词缩写

    Given an array of n distinct non-empty strings, you need to generate minimal possible abbreviations ...