李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
责任链设计模式简介
Leefs
2020-03-28 PM
1257℃
0条
# 责任链设计模式简介 ### 一、概念 **责任链设计模式:**为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每一个接收者都包含对另一个接收者的引用。**如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。** ### 二、介绍 **意图:**避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 **主要解决:**职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。 **优点:** 1. 1.降低耦合度,它将请求的发送者和接收者解耦 2. 2.简化了对象,使得对象不需要知道链的结构 3. 3.增强给对象指派职责的灵活性,通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4. 4.增加新的请求处理类很方便 **缺点:** 1. 1.不能保证请求一定被接收 2. 2.系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3. 3.可能不容易观察运行时的特征,有碍于除错。 **使用场景:** 1. 1.有多个对象可以处理同一个请求,具体哪个对象处理请求由运行时刻自动确定 2. 2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求 3. 3.可动态指定一组对象处理请求 ### 三、简单使用示例 **结构图** ![责任链设计模式简介01.png][1] **使用场景** 多个对象可以处理同一个请求,但具体由哪个对象处理,只有到运行的时候动态决定 **示例** **Handler** ```java /** * 抽象处理着角色,声明请求处理方法,并在其中保留一个对下一个处理节点的对象的引用 */ public abstract class Handler { /** * 下一个节点的处理者 */ protected Handler successor; /** * 处理请求方法 * @param condition */ public abstract void handleRequest(String condition); } ``` **Handler1** ```java /** * 第一个对象处理者 */ public class Handler1 extends Handler { @Override public void handleRequest(String condition) { if (condition.equals("handler1Request")){ System.out.println("Handler1 handler request"); return; }else{ successor.handleRequest(condition); } } } ``` **Handler2** ```java /** * 第二个对象处理者 */ public class Handler2 extends Handler { @Override public void handleRequest(String condition) { if (condition.equals("handler2Request")){ System.out.println("Handler2 handler request"); return; }else{ successor.handleRequest(condition); } } } ``` **Main** ```java public class Main { public static void main(String args[]){ //how to use Handler1 handler1=new Handler1(); Handler2 handler2 =new Handler2(); handler1.successor=handler2; handler2.successor=handler1; handler1.handleRequest("handler2Request"); } } ``` > 运行结果 ``` Handler2 handler request ``` ### 四、具体使用场景 公司员工进行报销单子,假如组长的报销的金额是1000,经理报销的金额是3000,超过3000的则老板进行报销,模拟以上场景,实现责任链示例如下: **Leader** ```java /** * 抽象领导 */ public abstract class Leader { //上级领导 Leader nextHandler; //报销金额 abstract int limit(); //具体处理请求方法 abstract void handler(int money); //是否处理请求判断 void handerRequest(int money) { if (money < limit()) { handler(money); } else { if (nextHandler != null) nextHandler.handerRequest(money); } } } ``` **BossHandler** ```java /** * 老板 */ public class BossHandler extends Leader { @Override int limit() { return Integer.MAX_VALUE; } @Override void handler(int money) { System.out.println("老板报销了:" + money); } } ``` **ManagerHandler** ```java /** * 经理 */ public class ManagerHandler extends Leader { @Override int limit() { return 3000; } @Override void handler(int money) { System.out.println("项目经理报销了:" + money); } } ``` **GroupHandler** ```java /** * 组长 */ public class GroupHandler extends Leader { @Override int limit() { return 1000; } @Override void handler(int money) { System.out.println("组长报销了:" + money); } } ``` **Me** ```java public class Me { public static void main(String args[]) { GroupHandler groupHandler = new GroupHandler(); ManagerHandler managerHandler = new ManagerHandler(); BossHandler bossHandler = new BossHandler(); groupHandler.nextHandler = managerHandler; managerHandler.nextHandler = bossHandler; groupHandler.handerRequest(500); groupHandler.handerRequest(1900); groupHandler.handerRequest(8000); } } ``` > 运行结果 ``` 组长报销了:500 项目经理报销了:1900 老板报销了:8000 ``` *附:参考文章链接* *https://www.jianshu.com/p/754ce1e000f7* [1]: https://lilinchao.com/usr/uploads/2020/03/3700689200.png
标签:
设计模式
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/769.html
上一篇
动静分离简单介绍
下一篇
记一次CentOS 7安装Docker报错
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
43
标签云
随笔
Map
Spark Core
Spark
Livy
Shiro
Stream流
Nacos
哈希表
序列化和反序列化
Linux
正则表达式
DataX
SpringBoot
Beego
人工智能
Typora
Golang
nginx
LeetCode刷题
持有对象
Java阻塞队列
RSA加解密
Eclipse
JavaWEB项目搭建
Kafka
Hadoop
DataWarehouse
Redis
数据结构和算法
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞