一、什么是责任链模式
责任链模式定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
可以将它想象成一个管道,请求会顺着管道一段一段被传递,直到被处理。
二、责任链模式的优势和劣势
2.1 优势
- 解耦
- 扩展性高
- 简化链接
- 分担责任
2.2 劣势
- 可能请求到最末端也未得到处理
- 链中程序过多会影响性能
- 增加了客户端的复杂度
三、示例
我们来一段代码展示一下:
首先我们定义一个抽象类,这个类中定义我们要实现的逻辑的抽象实现和传输逻辑:
public abstract class Handler {
//用它打印日志
private static final Logger log = LoggerFactory.getLogger(Handler.class);
//定义一个要传递的参数
private final int num;
//参数获取
Handler(int num) {
this.num = num;
}
private Handler nextHandler;
//链接
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public final void submit(int i) {
if (i == num) {
//调用处理方法
this.handleLeave(i);
//不往下传递请求时打印这个
log.info("流程结束!!!");
}else if(this.nextHandler == null) {
//到最末端仍未处理请求打印这个
log.info("责任链中没有处理该数字的程序");
}else{
this.nextHandler.submit(i);
}
}
protected abstract void handleLeave(int i);
}
接着定义三个实现类,实现抽象类中的方法:
实现类 One:
public class One extends Handler{
private static final Logger oneLog = LoggerFactory.getLogger(One.class);
public One() {
super(1);
}
@Override
protected void handleLeave(int leave) {
//One 执行的逻辑
oneLog.info("打印数字 1");
}
}
实现类 Two:
public class Two extends Handler {
private static final Logger TwoLog = LoggerFactory.getLogger(Two.class);
public Two() {
super(2);
}
@Override
protected void handleLeave(int leave) {
//Two 执行的逻辑
TwoLog.info("打印数字 2");
}
}
实现 Three:
public class Three extends Handler {
private static final Logger ThreeLog = LoggerFactory.getLogger(Three.class);
public Three() {
super(3);
}
@Override
protected void handleLeave(int leave) {
//Three 执行的逻辑
ThreeLog.info("打印数字 3");
}
}
最后写一个客户端测试一下:
public class Client {
public static void main(String[] args) {
// 处理 3
Three three = new Three();
// 处理 2
Two two = new Two();
// 处理 1
One one = new One();
three.setNextHandler(two);
two.setNextHandler(one);
//提交
three.submit(1);
three.submit(2);
three.submit(3);
}
}
运行结果:
可以看到 One、Two、Three三个实现程序各司其职~