- 目的 : 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
- 核心 : 定义处理者接口(含处理方法和设置后继者的方法)。每个具体处理者判断自己能否处理请求,不能则转发给后继者。
- 场景 :适用于多级审批流程,如请假申请和报销审批。
首先有一个抽象处理者,声明了若干个处理方法
java
package chainofresponsibility;
public abstract class Filter {
private Filter successor;
public void setSuccessor(Filter successor){
this.successor = successor; // 设置下一个过滤器
}
public Filter getSuccessor(){ // 用以判断是否有下一个过滤器
return successor;
}
public abstract void handleFilter();
public abstract void handleFilter2();
}
具体处理者,实现了若干个具体处理方法
java
package chainofresponsibility;
public class ConcreteFilter extends Filter {
private String name;
public ConcreteFilter(String name) {
this.name = name;
}
@Override
public void handleFilter() {
System.out.println(name + " 处理请求");
if(getSuccessor() != null){ // 如果过滤器实例不为空
getSuccessor().handleFilter(); // 递归,所有的过滤器都要处理
}
}
@Override
public void handleFilter2() {
if(getSuccessor() != null){
getSuccessor().handleFilter2();
}else{
// 最后一个过滤器处理请求
System.out.println(name + " 处理请求");
}
}
}
最后是函数入口
java
package chainofresponsibility;
public class MainTest {
public static void main(String[] args) {
// 创建过滤器
Filter filter1 = new ConcreteFilter("村长");
Filter filter2 = new ConcreteFilter("镇长");
Filter filter3 = new ConcreteFilter("区长");
Filter filter4 = new ConcreteFilter("市长");
// 构建责任链
filter1.setSuccessor(filter2);
filter2.setSuccessor(filter3);
filter3.setSuccessor(filter4);
System.out.println("-----通过每一个过滤器,包括最后一个,顺序也是一次一次的处理----");
filter1.handleFilter();
System.out.println("----现在是交给最后一个过滤器处理----");
filter1.handleFilter2();
}
}
终端输出:
-----依次通过每一个过滤器处理----
村长 处理请求
镇长 处理请求
区长 处理请求
市长 处理请求
-----直接给最后一个过滤器处理----
市长 处理请求
