责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。责任链模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// 抽象处理者
abstract class Handler {
protected Handler nextHandler;

// 设置下一个处理者
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}

// 处理请求的抽象方法
public abstract void handleRequest(int level);
}

// 具体处理者1:初级经理
class JuniorManager extends Handler {
@Override
public void handleRequest(int level) {
if (level <= 1) {
System.out.println("初级经理处理了请求。");
} else if (nextHandler != null) {
nextHandler.handleRequest(level);
}
}
}

// 具体处理者2:中级经理
class MidLevelManager extends Handler {
@Override
public void handleRequest(int level) {
if (level == 2) {
System.out.println("中级经理处理了请求。");
} else if (nextHandler != null) {
nextHandler.handleRequest(level);
}
}
}

// 具体处理者3:高级经理
class SeniorManager extends Handler {
@Override
public void handleRequest(int level) {
if (level >= 3) {
System.out.println("高级经理处理了请求。");
} else if (nextHandler != null) {
nextHandler.handleRequest(level);
}
}
}

// 客户端代码
public class Main {
public static void main(String[] args) {
// 创建责任链上的处理者
Handler juniorManager = new JuniorManager();
Handler midLevelManager = new MidLevelManager();
Handler seniorManager = new SeniorManager();

// 组装责任链
juniorManager.setNextHandler(midLevelManager);
midLevelManager.setNextHandler(seniorManager);

// 发出请求
int requestLevel = 2;
juniorManager.handleRequest(requestLevel); // 输出:中级经理处理了请求。
}
}

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。责任链模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

责任链模式的核心思想

责任链模式的主要思想是将请求的处理责任分散到链条上的各个对象中,而不是由单一对象负责处理请求。每个对象都包含指向下一个处理者的引用,当一个对象无法处理请求时,它会将请求传递给下一个处理者,直到请求被处理或链条结束。

责任链模式的结构

  1. 抽象处理者(Handler): 定义处理请求的接口,并包含一个指向下一个处理者的引用。这个接口通常包含一个方法,用于处理请求或将请求传递给下一个处理者。
  2. 具体处理者(Concrete Handler): 继承抽象处理者,具体实现处理请求的逻辑。如果无法处理该请求,则将其传递给下一个处理者。
  3. 客户端(Client): 负责创建链条并向责任链发送请求。

责任链模式的优点

  1. 降低耦合性: 请求的发送者和处理者解耦,发送者不需要知道具体是谁处理了请求,也不需要了解链条的结构。
  2. 增强灵活性: 可以动态地修改责任链的结构,将请求的处理者链条顺序或数量灵活地改变。
  3. 符合开闭原则: 增加新的处理者无需修改现有的代码,只需要添加新的处理类并将其连接到链条中即可。

责任链模式的缺点

  1. 可能导致请求未被处理: 如果责任链没有合理的结束条件,可能会导致请求在链条上一直传递,最后没有任何处理者处理该请求。
  2. 性能问题: 如果责任链过长,请求需要经过很多处理者传递,可能会导致性能下降。

使用场景

责任链模式非常适合以下场景:

  • 请求的处理需要多个对象依次进行处理: 当一个请求需要多个处理者时,可以将这些处理者按顺序组织成链,逐个处理。
  • 动态组合处理流程: 处理者可以在运行时灵活地添加、删除或改变顺序,责任链模式提供了很好的灵活性。
  • 日志记录、权限控制等: 可以在处理某个主要功能之前,沿着责任链传递请求进行检查、验证或记录日志。

责任链模式的现实例子

  1. 事件处理: 在UI框架中,比如处理鼠标点击事件时,事件可能会沿着组件树进行传递,直到某个组件处理了该事件。
  2. 技术支持系统: 客户的技术请求可能由一线支持人员处理,如果问题复杂,则传递给二线支持人员,再不行则传递到开发团队。
  3. 过滤器链: 在Web应用中,请求可以经过多个过滤器(如身份验证、日志记录等),这些过滤器可以被视为责任链的一部分。