前言
今天开一个新坑,讲讲设计模式。从常用的设计模式入手,今天讲讲责任链模式。今天的例子都是基于Spring的。
使用场景及三种控制模式
啥是责任链模式呢?其实大家看了这么多博客,大多数举的例子是各种各样领导审批流程,当然这是最常见的使用场景。其实实际开发也有使用。例如servlet
的Filter
过滤器,消息处理器等等。
个人总结责任链主要注意以下几点:
- 有无返回值
责任链大多数情况是需要返回值的,也就是每一步处理的结果。但是也有这样的场景,例如处理某一条消息,会有不同的处理器执行,处理器之间是不关心其他的结果的,这种场景就是无返回值的责任链。 - 控制模式
这里控制模式指的是如何控制节点指向下一个处理节点的行为,根据这个可以分为:内部控制模式、外部控制模式 、节点控制模式 ,接下来会详细讲解的。
代码实现
内部控制模式
内部控制模式,顾名思义,就是通过手动指定下一个节点。一般是有个抽象类,抽象方法执行的是个个责任链节点的处理逻辑,代码如下。
核心类
public abstract class AbstractChainHandler<T extends Serializable> {
/**
* 下一个责任链节点
*/
protected AbstractChainHandler<T> nextHandler;
public void handle(T msg) {
// 本次处理
handleRequest(msg);
// 流转到下一个节点处理
Optional.ofNullable(nextHandler).ifPresent(handler -> handler.handle(msg));
}
/**
* 本次处理器处理逻辑
*
* @param msg 流水/回执
*/
protected abstract void handleRequest(T msg);
}
实体类
@Data
@AllArgsConstructor
public class TestDTO implements Serializable {
private String name;
private String userId;
}
下面是模拟两个节点处理,如果需要返回结果的话,自己定义结果类即可。
第一个处理节点
@Slf4j
@Service
public class FirstHandler extends AbstractChainHandler<TestDTO> {
public FirstHandler(SecondHandler secondHandler) {
this.nextHandler = secondHandler;
}
@Override
protected void handleRequest(TestDTO msg) {
log.in