设计模式 - 浅谈责任链模式

责任链模式

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

模式思路与原理

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

代码示例

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);
        }
    }
}

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

使用场景:

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

优缺点

优点

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

缺点

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

总结

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


本文链接:

https://pugqq.com/archives/chain-of-responsibility-pattern.html
设计模式 - 浅谈责任链模式 - I/O
快来做第一个评论的人吧~

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21