责任链模式

/ 设计模式

责任链模式(chain of responsibility)

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

GoF23种设计模式中,属于行为型模式( Behavioral Patterns)

责任链可以明确各个对象负责的界限,是的每个对象只用关心自己负责的逻辑。对外,责任链提供了统一的请求入口,请求者只需要提交请求而不用关心具体的处理逻辑。

另外,责任链可以很方便的调整组合和添加新的责任人,利于系统的拓展性从而满足业务的快速迭代。

实例

责任链模式总览

角色说明

举例

以公司日常出差经费报销流程为例。事件报销级别越高,审批的人就越高。

责任链模式举例

角色说明

code

public abstract class Handler {

    protected int level;
    protected String name;

    private Handler nextHandler;

    public Handler(int level, String name) {
        this.level = level;
        this.name = name;
    }

    public Handler setNextHandler(Handler handler) {
        this.nextHandler = handler;
        return nextHandler;
    }

    public final void handler(int event) {

        boolean check = check(event);

        if (check) {
            System.out.println(name + ":审批通过.");
        } else if (nextHandler != null) {
            System.out.println(name + ":报请上级审批.");
            nextHandler.handler(event);
        } else {
            System.out.println(name + ":拒绝通过.");
        }
    }

    protected abstract boolean check(int event);
}
public class GroupLeaderHandler extends Handler {

    public GroupLeaderHandler(int level, String name) {
        super(level, name);
    }

    @Override
    protected boolean check(int event) {
        return level >= event;
    }
}
public class DepartmentLeaderHandler extends Handler {

    public DepartmentLeaderHandler(int level, String name) {
        super(level, name);
    }

    @Override
    protected boolean check(int event) {
        return level >= event;
    }
}
public class BossHandler extends Handler {

    public BossHandler(int level, String name) {
        super(level, name);
    }

    @Override
    protected boolean check(int event) {
        return level >= event;
    }
}
public class Client {
    public static void main(String[] args) {

        Handler groupLeaderHandler = new GroupLeaderHandler(1, "[小组主管]张三");
        Handler departmentLeaderHandler = new DepartmentLeaderHandler(2, "[部门主管]李四");
        Handler bossHandler = new BossHandler(3, "[公司老板]王五");

        //经费报销工单链
        groupLeaderHandler.setNextHandler(departmentLeaderHandler).setNextHandler(bossHandler);

        System.out.println("报请出差经费200元工单:");
        groupLeaderHandler.handler(2);

        System.out.println("\n报请出差经费500万元工单:");
        groupLeaderHandler.handler(5);
    }
}
报请出差经费200元工单:
[小组主管]张三:报请上级审批.
[部门主管]李四:审批通过.

报请出差经费500万元工单:
[小组主管]张三:报请上级审批.
[部门主管]李四:报请上级审批.
[公司老板]王五:拒绝通过.

实例

code:javax.servlet.Filter

spring支持过滤器的设置,用户自己的过滤器会在项目启动时通过扫描加载到ApplicationFilterConfig中,然后通过ApplicationFilterChain对自定义的Filter进行排序,调用等处理。

角色说明

总结

责任链模式在日常的开发中应用的最为频繁。每个微服务的核心处理流程都可以采用该设计模式进行系统设计。

使用责任链模式可以将复杂的业务流程解耦,使得处理的每一步只用关心自己的逻辑,让系统高内聚低耦合。