笔者最近在研究SpringMVC的请求处理过程,发现请求拦截器的处理过程就是责任链模式的很好体现,一环扣一环,异常就退出,无需后继处理。
责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。——百度百科
责任链模式的类图:
工作中申请费用时一般根据金额大小会有不同的审批人选,比如小于1000元只需项目经理同意即可,3000元以下需要部门经理同意,超过3000元的需要总经理同意,那我们通过使用责任链模式实现此例子。
public abstract class Handler {
private Handler successor;
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor){
this.successor = successor;
}
public abstract String handleRequest();
}
public class ProjectManager extends Handler{
public String handleRequest(int amount) {
System.out.println("当前处理人:项目经理");
if(amount < 1000){
return "审批通过";
}else {
System.out.println("金额超限,已流转至部门经理");
return getSuccessor().handleRequest(amount);
}
}
}
public class DeptManager extends Handler{
public String handleRequest(int amount) {
System.out.println("当前处理人:部门经理");
if(amount < 3000){
return "审批通过";
}else {
System.out.println("金额超限,已流转至总经理");
return getSuccessor().handleRequest(amount);
}
}
}
public class GeneralManager extends Handler{
public String handleRequest(int amount) {
System.out.println("当前处理人:总经理");
return "审批通过";
}
}
我们来测试一下当我们需要申请不同的费用时的逻辑是否正确。
public class ResponsibilityChainTest {
public static void main(String[] args) {
Handler projectManager = new ProjectManager();
Handler deptManager = new DeptManager();
Handler generalManager = new GeneralManager();
projectManager.setSuccessor(deptManager);
deptManager.setSuccessor(generalManager);
System.out.println(projectManager.handleRequest(500));
System.out.println("==========================\n");
System.out.println(projectManager.handleRequest(1500));
System.out.println("==========================\n");
System.out.println(projectManager.handleRequest(3500));
}
}
运行结果: