1、基本概念
责任链模式采用链表结构,将链中每一个节点看作是一个处理不同请求的对象
且内部自动维护一-个下一个节点对象。当一个请求从链式的首端发出时,会沿着链的路径
依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。
生活中的案例:工作的审批,报备流程,闯关游戏等
2、类图和角色
类图:
主要两个角色:
抽象处理者:AbstractHandler
具体处理者:ConcreteAbstractHandlerA,ConcreteAbstractHandlerB,ConcreteAbstractHandlerC
3、案例
案例:假如一个项目得到开发报备,项目————》经过项目经理审批————》产品经理审批 ————》财务经理审批
类图:
抽象处理者:接口IProjectHandler
public interface IProjectHandler { void doHandler(String req); }
抽象处理者:抽象类AbstractProjectHandler
public abstract class AbstractProjectHandler implements IProjectHandler{ protected IProjectHandler nextHandler; public void setNextHandler(IProjectHandler handler){ this.nextHandler = handler; } public abstract void doHandler(String req); }
具体处理者:项目经理审批ProjectManagerHandler
public class ProjectManagerHandler extends AbstractProjectHandler { @Override public void doHandler(String req) { System.out.print("项目经理同意,交由产品经理审批 ————》"); this.nextHandler.doHandler(req); } }
具体处理者:产品经理审批ProductManagerHandler
public class ProductManagerHandler extends AbstractProjectHandler { @Override public void doHandler(String req) { System.out.print("产品经理同意,交由财务经理审批————》"); this.nextHandler.doHandler(req); } }
具体处理者:财务经理审批FinancialManagerHandler
public class FinancialManagerHandler extends AbstractProjectHandler { @Override public void doHandler(String req) { System.out.println("财务经理审批通过"); } }
dev类:
public class Dev {
public void submitProject(){
ProjectManagerHandler projectManagerHandler = new ProjectManagerHandler();
ProductManagerHandler productManagerHandler = new ProductManagerHandler();
FinancialManagerHandler financialManagerHandler = new FinancialManagerHandler();
projectManagerHandler.setNextHandler(productManagerHandler);
productManagerHandler.setNextHandler(financialManagerHandler);
projectManagerHandler.doHandler("开发云项目");
}
}
测试:
public class Test { public static void main(String[] args) { Dev dev = new Dev(); dev.submitProject(); } }
测试输出:
项目经理同意,交由产品经理审批 ————》产品经理同意,交由财务经理审批————》财务经理审批通过
各自处理各自的任务,这样一个简单得责任链模式就完成了。在上面的dev代码中,我们可以看到在维护下一个节点的过程有些繁琐
对于这种结构我们可以想到建设者模式java设计模式(四)——建造者模式
修改抽象类AbstractProjectHandler 的代码,加入一个内部类Builder:
public abstract class AbstractProjectHandler implements IProjectHandler{ protected IProjectHandler nextHandler; public void setNextHandler(IProjectHandler handler){ this.nextHandler = handler; } public abstract void doHandler(String req); public static class Builder{ private AbstractProjectHandler head; private AbstractProjectHandler tail; public Builder addHandler(AbstractProjectHandler handler){ if(this.head == null){ this.head = this.tail = handler; } this.tail.setNextHandler(handler); this.tail = handler; return this; } public AbstractProjectHandler build(){ return this.head; } } }
dev类修改:
public class Dev { public void submitProject(){ ProjectManagerHandler projectManagerHandler = new ProjectManagerHandler(); ProductManagerHandler productManagerHandler = new ProductManagerHandler(); FinancialManagerHandler financialManagerHandler = new FinancialManagerHandler(); /* projectManagerHandler.setNextHandler(productManagerHandler); productManagerHandler.setNextHandler(financialManagerHandler); projectManagerHandler.doHandler("开发云项目");*/ AbstractProjectHandler.Builder builder = new AbstractProjectHandler.Builder(); builder.addHandler(projectManagerHandler). addHandler(productManagerHandler). addHandler(financialManagerHandler); builder.build().doHandler("开发云项目"); } }
我们可以看到这样的结构就会清晰许多。
4、优缺点
责任链模式的优点:
1、请求和处理是解耦的
2、请求节点可以处理能处理的请求,无法处理的交给下一个节点继续处理
3、易于扩展节点,符合开闭原则。