李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
责任链设计模式简介
Leefs
2020-03-28 PM
1649℃
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://lilinchao.com/archives/769.html
上一篇
动静分离简单介绍
下一篇
记一次CentOS 7安装Docker报错
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Stream流
链表
队列
机器学习
Java编程思想
Filter
并发线程
栈
序列化和反序列化
MyBatis-Plus
Http
Spark
CentOS
Kafka
Spark SQL
字符串
Redis
RSA加解密
Nacos
递归
微服务
HDFS
哈希表
国产数据库改造
Golang基础
FileBeat
Docker
二叉树
Quartz
Golang
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭