1、基本概念

责任链模式采用链表结构,将链中每一个节点看作是一个处理不同请求的对象
且内部自动维护一-个下一个节点对象。当一个请求从链式的首端发出时,会沿着链的路径
依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。

 

生活中的案例:工作的审批,报备流程,闯关游戏等

 

2、类图和角色

类图:

java 开源责任链模式 java责任链模式实例_设计模式

 

主要两个角色:

抽象处理者:AbstractHandler

具体处理者:ConcreteAbstractHandlerA,ConcreteAbstractHandlerB,ConcreteAbstractHandlerC

 

3、案例

案例:假如一个项目得到开发报备,项目————》经过项目经理审批————》产品经理审批 ————》财务经理审批

类图:

java 开源责任链模式 java责任链模式实例_设计模式_02

 

 抽象处理者:接口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代码中,我们可以看到在维护下一个节点的过程有些繁琐

对于这种结构我们可以想到建设者模式

修改抽象类AbstractProjectHndler 的代码,加入一个内部类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、易于扩展节点,符合开闭原则。