您现在的位置是:首页 >技术教程 >设计模式之责任链模式网站首页技术教程
设计模式之责任链模式
简介设计模式之责任链模式
文章目录
1、前言
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了
2、应用场景和说明
- 多个对象处理一个请求,具体哪个对象处理该请求由运行时刻自动确定。例如请假流程、参数处理流程
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。例如审批流中,不确定哪一个领导不用审批,只管提交就好
- 可动态的指定一组对象处理。
3、角色说明
- 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
- 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
4、案例分析(审批流程)
AuditHandler
:接口,定义需要执行的方法,以及是否跳过当前的Handler
。ChainHandler
:执行链,管理所有的链条节点,以及执行节点方法。XxxxHandler
:具体的执行节点,实现AuditHandler
接口。InterfaceTest
:客户端
说明:
实现一个审批流,直接领导审核 -> 经理审核 -> CTO审核,其中某一个节点不审批可以直接跳过。
5、代码展示
5.1 AuditHandler接口
public interface AuditHandler {
// 当前节点是否跳过
default boolean skip(){
return false;
}
// 执行方法
void execute(ChainHandler chain);
}
5.2 ChainHandle执行链
public class ChainHandler {
// 执行链节点的角标
private int index;
// 所有的执行链的节点
private final List<AuditHandler> handlerList = new ArrayList<>();
public ChainHandler addHandler(AuditHandler handler){
handlerList.add(handler);
return this;
}
public void execute() {
if (handlerList.size() == index) {
System.out.println("审批链执行完成.....");
return;
}
// 按照添加顺序执行
AuditHandler auditHandler = handlerList.get(index++);
if (auditHandler.skip()) {
auditHandler = handlerList.get(index++);
}
auditHandler.execute(this);
}
}
5.3 XxxxHandler具体的角色
// 直属领导角色
public class DirectLeaderHandler implements AuditHandler {
@Override
public void execute(ChainHandler chain) {
System.out.println("直属领导审批完成......");
chain.execute();
}
}
// 经理角色
public class ManageHandler implements AuditHandler {
@Override
public boolean skip() {
return true;
}
@Override
public void execute(ChainHandler chain) {
System.out.println("经理审批完成......");
chain.execute();
}
}
// CTO
public class CTOHandler implements AuditHandler {
@Override
public void execute(ChainHandler chain) {
System.out.println("CTO审批完成......");
chain.execute();
}
}
5.4 InterfaceTest客户端
public class InterfaceTest extends ChainHandler {
public static void main(String[] args) {
ChainHandler chain = new ChainHandler();
chain.addHandler(new DirectLeaderHandler())
.addHandler(new ManageHandler())
.addHandler(new CTOHandler());
chain.execute();
}
}
6、源码解析
客户端增加三个Handler
,按照添加的顺序执行的分别为直属领导审核
->经理审核
->CTO审核
。但是AuditHandler
接口中定义了是否跳过当前节点,默认是fase。其中ManageHandler
选择了跳过,所以执行的结果该节点就会跳过。下面来看一下运行结果:
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。