责任链模式是一种行为设计模式,通常用于将请求从一个处理者传递到下一个处理者,并依次处理请求,直到所有处理者都无法处理为止。
在责任链模式中,每个处理者都有机会处理请求并决定是否将请求传递给下一个处理者。这样,请求就可以在处理者之间自由流动,而不需要明确地指定哪个处理者将处理特定请求。这种灵活性使责任链模式特别适用于动态的、重叠的或未知的请求处理流程。
场景
责任链模式的应用场景包括但不限于:处理请求、日志记录、权限验证、缓存等。该模式适用于多个处理对象按照一定规则处理同一类请求,且请求的接收者并不确定时使用。
优点
缺点
以面试过程为例:
1.定义面试处理程序
/**
* 面试处理程序
*/
public abstract class Interview {
/**
* 下一轮面试
*/
protected Interview successor;
/**
* 开始下一轮面试
* @param successor 下一轮面试
* @return 面试处理程序
*/
public Interview connect(Interview successor) {
this.successor = successor;
// 这里返回后继节点,方便后面链式调用
return successor;
}
/**
* 开始面试
*/
public void handle() {
// 面试过程。由不同的子类实现具体处理过程
this.doHandle();
//责任链上如果还有后继节点,就继续向下传递
Optional.ofNullable(this.successor).ifPresent(Interview::handle);
}
/**
* 面试过程
* 采用模板模式,变化的逻辑定义为抽象的,交由子类继承实现
*/
public abstract void doHandle();
}
2.定义具体面试
① 第一轮面试
public class FirstInterview extends Interview{
@Override
public void doHandle() {
System.out.println("第一轮面试");
}
}
② 第二轮面试
public class SecondInterview extends Interview{
@Override
public void doHandle() {
System.out.println("第二轮面试");
}
}
③ 第三轮面试
public class ThirdInterview extends Interview{
@Override
public void doHandle() {
System.out.println("第三轮面试");
}
}
3.调用
public class Client {
public static void main(String[] args) {
// 首先定义第一轮面试
Interview interview = new FirstInterview();
// 连接后续两轮面试
interview.connect(new SecondInterview()).connect(new ThirdInterview());
// 开始面试
interview.handle();
}
}
控制台输出:
第一轮面试
第二轮面试
第三轮面试
这样就实现按照预定的顺序的三轮面试。如果需要将第三轮面试调整到第二轮之前,只需要将连接顺序改变即可:
interview.connect(new ThirdInterview()).connect(new SecondInterview());
这就是责任链模式的好处,可以非常方便的对流程进行调整和控制。