定义
责任链是行为型设计模式的一种,通过前一个处理者记录下一个处理者的方式形成一条处理链。客户端在调用时只需要将请求传递到责任上即可,无需关注链路中的具体的传递过程。而链路中内部的处理,是按照前一个处理者记录的下一个处理者依次执行。这样可以避免客户端调用方和多个处理者对象耦合。
责任链模式结构
- 抽象处理器 :定义下一个处理器对象和处理方法,交给子类实现
- 具体处理器 :继承抽象处理类,对处理方法按需实现。在处理方法的最后调用下一个处理器的处理方法。
- 调用方 :组装处理器链,将调用请求发送给处理器链的顶端。
类图
代码实现
使用JavaSE代码实现责任链模式。
定义抽象处理器
/**
* 抽象处理器
*
* @author lishuzhen
* @createTime 2022年06月09日 21:22:00
*/
public abstract class AbstractHandler {
private AbstractHandler nextHandler;
/**
* 定义抽象方法,执行具体的计算逻辑
*
* @return
*/
abstract public Object doFilter();
public AbstractHandler getNextHandler() {
return nextHandler;
}
public void setNextHandler(AbstractHandler nextHandler) {
this.nextHandler = nextHandler;
}
}
定义具体的处理器实现类
/**
* A处理器实现
*
* @author lishuzhen
* @createTime 2022年06月09日 21:23:00
*/
public class AHandler extends AbstractHandler {
/**
* 定义抽象方法,执行具体的计算逻辑
*
* @return
*/
@Override
public Object doFilter() {
System.out.println("A doSomething");
if (getNextHandler() != null) {
// 如果存在下一个处理器,则继续向下调用
return getNextHandler().doFilter();
}
return new Object();
}
}
/**
* B处理器实现
*
* @author lishuzhen
* @createTime 2022年06月09日 21:23:00
*/
public class BHandler extends AbstractHandler {
/**
* 定义抽象方法,执行具体的计算逻辑
*
* @return
*/
@Override
public Object doFilter() {
System.out.println("B doSomething");
if (getNextHandler() != null) {
// 如果存在下一个处理器,则继续向下调用
return getNextHandler().doFilter();
}
return new Object();
}
}
定义调用方
public class ClientDemo {
public static void main(String[] args) {
// 构建A处理器对象
AHandler aHandler = new AHandler();
// 构建A处理器对象
BHandler bHandler = new BHandler();
// 组装处理器链, A处理器作为第一个处理器, 为A处理器设置下一个处理器
aHandler.setNextHandler(bHandler);
// 将请求发送给处理器链的顶端
aHandler.doFilter();
}
}
执行main方法
控制台打印日志如下,说明程序按照demo中设定好的 A -> B 顺序正确执行。
A doSomething
B doSomething
总结
优点
- 降低了各个处理器之间的耦合,各处理器只关注处理自身的内部逻辑,然后抛给下一个处理器即可。不需要关注具体的上下游调用关系。
- 提高可扩展性,可在组装处理器链时对链路进行扩展。
- 可灵活调整各处理器之间的调用顺序
缺点
- 调用方需要组装处理器链,虽然降低了处理器间的耦合,但是组装链时却存在耦合。(下一篇博文中会提出通过spring容器来解决创建链的问题)
- 会增加程序的复杂度,需评估酌情使用,不可为了设计模式而用设计模式。