1. 设计模式之责任链模式:动态组装不同的复杂业务流程

1.1. 介绍

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式

责任链模式通过将多个处理器(处理对象)以链式结构连接起来,使得请求沿着这条链传递,直到有一个处理器处理该请求为止。

责任链的思想

  1. 将一个业务流程中的多个步骤拆分开来,每个步骤封装到一个handler处理器中去

  2. 支持业务流程基于handler动态组装,不同的业务流程中 -> handler代表的代码组件可以复用

应用场景

  1. 多级审批流程:如请假、报销审批(经理→总监→CEO)。

  2. Web请求处理:Servlet过滤器链、Spring MVC拦截器。

  3. 异常处理:多个异常处理器按顺序尝试捕获异常。

  4. 日志记录:不同级别的日志处理器(DEBUG → INFO → ERROR)。

优缺点及建议

优点
1.降低耦合度:发送者和接收者之间解耦。
2.简化对象:对象不需要知道链的结构。
3.灵活性:通过改变链的成员或顺序,动态地新增或删除责任。
4.易于扩展:增加新的请求处理类很方便。

缺点
1.请求未被处理:不能保证请求一定会被链中的某个处理者接收。
2.性能影响:可能影响系统性能,且调试困难,可能导致循环调用。
3.难以观察:运行时特征不明显,可能妨碍除错。

使用建议
1.在处理请求时,如果有多个潜在的处理者,考虑使用责任链模式。
2.确保链中的每个处理者都明确知道如何传递请求到链的下一个环节。

注意事项
1.适用场景:需要 多级、灵活处理流程 时优先使用(如审批、过滤、异常处理)。

1.2. 实现及相关代码

假设有一个业务,有多个流程步骤,两种不同业务,只是流程步骤顺序不同。

1.2.1. 没使用设计模式方式

调用方法

public static void main(String[] args) {
    // 业务流程1
    System.out.println("执行功能1");
    System.out.println("执行功能2");
    System.out.println("执行功能3");

    // 业务流程2
    System.out.println("执行功能3");
    System.out.println("执行功能1");
    System.out.println("执行功能2");
}

可能会遇到的问题

这样会有大量的重复代码出现了,功能123的代码,都出现在了两个地方,有复制粘贴的现象。如果,现在要对某个功能的代码进行修改,那么就要在多个地方去修改这个功能的代码。

另外,如果现在要对某个业务流程的顺序进行调整或者改造,或者新增顺序不一样的流程,就要去修改大量的代码。

1.2.2. 使用设计模式方式

使用责任链模式,将功能逻辑封装到一个个handler中,后面如果要对某个步骤的代码逻辑调整,修改一个handler即可。

如果业务流程要修改或者新增不同顺序的业务流程,那么不需要拷贝大量的代码,只要基于handler动态组装业务流程即可。

接口及数据对象

public static abstract class Handler {
    protected Handler successor;

    public Handler(Handler successor) {
        this.successor = successor;
    }

    public abstract void execute();
}

public static class Handler1 extends Handler {
    public Handler1(Handler successor) {
        super(successor);
    }

    public void execute() {
        System.out.println("执行功能1");
        if(successor != null) {
            successor.execute();
        }
    }
}

public static class Handler2 extends Handler {
    public Handler2(Handler successor) {
        super(successor);
    }

    public void execute() {
        System.out.println("执行功能2");
        if(successor != null) {
            successor.execute();
        }
    }
}

public static class Handler3 extends Handler {
    public Handler3(Handler successor) {
        super(successor);
    }

    public void execute() {
        System.out.println("执行功能3");
        if(successor != null) {
            successor.execute();
        }
    }
}

调用方法

public static void main(String[] args) {
    // 业务流程1
    Handler thirdHandler = new Handler3(null);
    Handler secondHandler = new Handler2(thirdHandler);
    Handler firstHandler = new Handler1(secondHandler);
    firstHandler.execute();

    // 业务流程2
    thirdHandler = new Handler3(null);
    secondHandler = new Handler1(thirdHandler);
    firstHandler = new Handler2(secondHandler);
    firstHandler.execute();
}

results matching ""

    No results matching ""