您现在的位置是:首页 >技术杂谈 >【Java开发】设计模式 14:责任链模式网站首页技术杂谈

【Java开发】设计模式 14:责任链模式

尹煜 2023-05-14 16:13:54
简介【Java开发】设计模式 14:责任链模式

1 责任链模式介绍

责任链模式是一种行为设计模式,通常用于将请求从一个处理者传递到下一个处理者,并依次处理请求,直到所有处理者都无法处理为止。

在责任链模式中,每个处理者都有机会处理请求并决定是否将请求传递给下一个处理者。这样,请求就可以在处理者之间自由流动,而不需要明确地指定哪个处理者将处理特定请求。这种灵活性使责任链模式特别适用于动态的、重叠的或未知的请求处理流程。

📌 场景

责任链模式的应用场景包括但不限于:处理请求、日志记录、权限验证、缓存等。该模式适用于多个处理对象按照一定规则处理同一类请求,且请求的接收者并不确定时使用。

📌 优点

  1. 降低系统耦合度,将请求发送者和接收者解耦。
  2. 简化了对象之间的关系。
  3. 增强了系统的灵活性,可以动态地新增或删除责任链中的处理对象。
  4. 可以对请求进行筛选,合理分配资源,提高系统的性能。

📌 缺点

  1. 当责任链过长时,会导致系统性能下降,因为每个请求都要遍历整个责任链。
  2. 对于比较复杂的业务场景,责任链模式可能会使代码难以维护和理解。
  3. 可能会存在处理漏洞的情况,即某个请求未被正确处理,导致系统出现异常。

2 责任链模式实现

以面试过程为例:

📌 1.定义面试处理程序

/**
 * 面试处理程序
 */
public abstract class Interview {
    /**
     * 下一轮面试
     */
    protected Interview successor;

    /**
     * 开始下一轮面试
     * @param successor 下一轮面试
     * @return 面试处理程序
     */
    public Interview connect(Interview successor) {
        this.successor = successor;
        // 这里返回后继节点,方便后面链式调用
        return successor;
    }

    /**
     * 开始面试
     */
    public void handle() {
        // 面试过程。由不同的子类实现具体处理过程
        this.doHandle();
        //责任链上如果还有后继节点,就继续向下传递
        Optional.ofNullable(this.successor).ifPresent(Interview::handle);
    }

    /**
     * 面试过程<br>
     * 采用模板模式,变化的逻辑定义为抽象的,交由子类继承实现
     */
    public abstract void doHandle();
}

📌 2.定义具体面试

① 第一轮面试

public class FirstInterview extends Interview{

    @Override
    public void doHandle() {
        System.out.println("第一轮面试");
    }
}

② 第二轮面试

public class SecondInterview extends Interview{

    @Override
    public void doHandle() {
        System.out.println("第二轮面试");
    }
}

③ 第三轮面试

public class ThirdInterview extends Interview{

    @Override
    public void doHandle() {
        System.out.println("第三轮面试");
    }
}

📌 3.调用

public class Client {
    public static void main(String[] args) {
        // 首先定义第一轮面试
        Interview interview = new FirstInterview();
        // 连接后续两轮面试
        interview.connect(new SecondInterview()).connect(new ThirdInterview());
        // 开始面试
        interview.handle();
    }
}

控制台输出:

第一轮面试
第二轮面试
第三轮面试

这样就实现按照预定的顺序的三轮面试。如果需要将第三轮面试调整到第二轮之前,只需要将连接顺序改变即可:

interview.connect(new ThirdInterview()).connect(new SecondInterview());

这就是责任链模式的好处,可以非常方便的对流程进行调整和控制。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。