Featured image of post 责任链模式

责任链模式

📖 介绍

责任链模式是一种行为型模式。是一种处理请求的模式,请求在链上传递,每个处理器都有机会处理请求。处理器可以决定请求是否向下传递(如无法处理,需要交给下一个处理),或者直接返回(如处理完成,返回结果)。

通过责任链模式,可以让请求的发送者和处理请求的处理器进行结构,每个处理器只处理特定的情况,可以方便地添加/删除处理器。

常见的场景:

  • 🔖 疫情期间请假出校,学校领导的层层审批 😂

  • 🔖 击鼓传花游戏

  • 🔖 缓存架构,在缓存中没有找到数据,往数据库总查找

  • 🔖 GUI 程序对点击按钮的处理

🎈 实现方式

关键:每个处理器都实现统一的接口,内部包含下一个 ⏭️ 处理器 next 和本处理器的 🔨处理方式 execute。

  • 🎗️ 声明一个处理器的通用接口。

  • 🎗️ 具体的处理者。决定是否处理请求 / 请求是否传递给下一个。

  • 🎗️ 责任链。

    • 实现方式一:🔗 包含一个 List,可以用来构建处理请求的数据。process 方法对 List 进行循环,处理器可以执行就处理相应的方法,不能执行返回 null 之类。
    • 实现方式二:在处理器中包含 next,为下一个处理器,不能执行调用 next 的方法。

处理者可以决定是否沿着链传递请求,可以

  • (1)处理不了传递给下一个处理器,成功后直接返回,一个请求只能一个处理器执行;
  • (2)所有处理器都依次执行一次请求,完成相应的内容。

🛠️ 实现

1
2
3
4
5
6
7
// 通用方法定义
interface Handler {
    // true -> 处理成功
    // false -> 拒绝
    // null -> 交给下一个处理
    boolean process(Request request);
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 具体处理器
public ManagerHandler implements Handler {
    public boolean process(Request request) {
        // if () ...
    }
}

public DirectorHandler implements Handler {
}

public CEOHandler implements Handler {
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public class HandlerChain {
    private List<Handler> handlers = new ArrayList<>();

    public void addHandler(Handler handler) {
        this.handlers.add(handler);
    }

    public boolean process(Requst request) {
        for (Handler handler : handers) {
            boolean b = handler.process(request);
            if (b != null) {
                // 根据 true / false 是否要结束调用链
                if (...) {
                    // ...
                    return b;
                }
            }
        }
        throw new RuntimeException("Could not handle request: " + request);
    }
}