一个故事
小张需要申请一台显示器,需要在公司内部系统提交审核清单。审核清单的审批流程要经过直属领导、部门领导、资源部领导几个环节审批,其中任何一个环节审核不通过,显示器就申请不下来。
责任链模式来模拟审批流程
审批流程就像一个链条一样,一级一级审批,直到最后资源部领导核查通过,小张就能拿到想要的显示器了
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public abstract class VerifyHandler { private VerifyHandler nextVerify;
public void setNextVerify(VerifyHandler nextVerify){ this.nextVerify = nextVerify; }
public abstract void examine(Request request);
public void nextVerify(Request request){ if(nextVerify != null){ this.nextVerify.examine(request); } } }
|
1 2 3 4 5 6 7 8 9 10 11
| public class TeamLeaderVerifyHandler extends VerifyHandler{
@Override public void examine(Request request) { System.out.println(request.getRequest());
System.out.println("直属领导审批通过");
nextVerify(request); } }
|
1 2 3 4 5 6 7 8
| public class ApartmentVerifyHandler extends VerifyHandler{ @Override public void examine(Request request) { System.out.println("部门领导审批通过");
nextVerify(request); } }
|
1 2 3 4 5 6 7
| public class ResourceVerifyHandler extends VerifyHandler{ @Override public void examine(Request request) { System.out.println("资源部领导审批通过"); System.out.println("发放显示器"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Request { private String request;
public String getRequest() { return request; }
public void setRequest(String request) { this.request = request; }
public Request(String request){ this.request = request; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Client { public static void main(String[] args) { TeamLeaderVerifyHandler teamLeaderVerifyHandler = new TeamLeaderVerifyHandler(); ApartmentVerifyHandler apartmentVerifyHandler = new ApartmentVerifyHandler(); ResourceVerifyHandler resourceVerifyHandler = new ResourceVerifyHandler();
teamLeaderVerifyHandler.setNextVerify(apartmentVerifyHandler); apartmentVerifyHandler.setNextVerify(resourceVerifyHandler);
Request request = new Request("申请一条显示器"); teamLeaderVerifyHandler.examine(request); } }
|
如何理解责任链模式
使多个对象都有机会处理请求,从未避免了发送者与接收者之间的耦合关系,将这些对象连成一个链条,沿着链条传递请求。其结构和链表是类似的。
当有审批流程进入时,先经过直属领导审批,待直属领导审批通过后,再把审批请求传递给部门领导,部门领导审批过后再传递给资源部领导,由此类推,形成一个链条,链条上的每个对象的职责各不相同。
责任链模式模型抽象
类图(TODO)
责任链模式的应用
责任链模式的优点
责任链模式的缺点
- 性能问题。链表较长的时候会有性能问题(应该设置节点阈值)
- 调试逻辑比较复杂(调用者不知道被哪些接受者调用)