[设计模式] 浅谈责任链模式

2024 年 5 月 7 日 星期二(已编辑)
/ ,
4
这篇文章上次修改于 2024 年 5 月 7 日 星期二,可能部分内容已经不适用,如有疑问可询问作者。

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

[设计模式] 浅谈责任链模式

责任链模式

模式功能说明:它让你可以将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或者将其传递给链上的下一个处理者。

模式思路与原理

职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

案例

abstract class Handler {
    protected Handler successor;

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

    public abstract void handleRequest(int request);
}

class ConcreteHandler1 extends Handler {
    public void handleRequest(int request) {
        if (request >= 0 && request < 10) {
            System.out.println("Handler1处理请求" + request);
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

class ConcreteHandler2 extends Handler {
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("Handler2处理请求" + request);
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

public class Client {
    public static void main(String[] args) {
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        h1.setSuccessor(h2);
        int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};
        for (int request : requests) {
            h1.handleRequest(request);
        }
    }
}

我们有两个处理者类ConcreteHandler1和ConcreteHandler2,它们都继承自抽象处理者类Handler。每个处理者都有一个successor,当它不能处理请求时,会将请求传递给successor。在客户端,我们创建了两个处理者对象,并将它们连接起来,然后将一些请求传递给第一个处理者。

使用场景:

  • 当你希望动态地根据对象状态决定处理者时,可以使用责任链模式。
  • 当你不希望请求发送者与接收者耦合时,可以使用责任链模式。

优缺点

优点:

  1. 你可以控制请求处理的顺序。
  2. 单一职责原则。 你可以将处理逻辑分解成许多不同的类。
  3. 开闭原则。 你可以在不更改现有代码的情况下在程序中添加新的处理者。

缺点:

  1. 一些请求可能会未被处理。

总结

责任链模式使用了设计原则有:开闭原则(对扩展开放,对修改关闭)和单一职责原则(一个类只做一件事情)。 责任链模式是一种将请求的发送者和接收者解耦的方法,它允许请求在处理者链上进行传递,每个处理者都有机会处理请求。这种模式在处理多级审批、事件/消息系统等场景时非常有用。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...