设计模式:责任链模式

“责任链模式是一种行为型设计模式,它通过将多个处理对象连接成一条链,使得每个处理对象都有机会处理请求,直到请求被处理为止。请求的发送者与接收者解耦,发送者无需关心请求由谁处理,也无需关心处理的顺序。

责任链模式的优点包括:

  • 降低耦合度:发送者与处理者解耦,增加系统的灵活性。
  • 增强灵活性:可以动态地添加、删除或重新组织处理者,改变处理逻辑。
  • 增加可扩展性:可以通过增加新的处理者来扩展责任链,处理新的请求类型。

责任链模式的缺点包括:

  • 性能问题:如果责任链过长,可能导致请求处理的时间过长,影响系统性能。
  • 不保证请求一定被处理:如果没有合适的处理者来处理请求,可能导致请求被忽略。

例如,在一个权限校验系统中,可能有不同的处理步骤,如权限校验、数据验证、业务处理。可以使用责任链模式,将这些步骤连接成一条责任链,每个步骤负责处理相应的请求。”

1. 什么是责任链模式?

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

在责任链模式中,多个处理对象被连接成一条链,每个处理对象都包含对下一个处理对象的引用。请求沿着这条链传递,直到找到能够处理该请求的对象。如果当前对象不能处理请求,它会将请求传递给链上的下一个对象,直到链的末端。

2. 责任链模式的结构

责任链模式通常包含以下几个角色:

  • 抽象处理者(Handler):定义处理请求的接口或抽象类,包含处理请求的抽象方法和对下一个处理者的引用。
  • 具体处理者(ConcreteHandler):实现抽象处理者接口或继承抽象类,实现处理请求的方法。如果当前处理者能够处理请求,则处理;否则将请求传递给下一个处理者。
  • 客户端(Client):向链上的第一个处理者发送请求,并不关心请求最终由谁处理。

image-20240904175438314

3. 责任链模式的实现

以下是一个使用 Java 实现责任链模式的示例,假设我们有一个系统,可以处理不同级别的请求(如权限校验、数据验证、业务处理)。

1. 定义抽象处理者

1
2
3
4
5
6
7
8
9
10
11
12
// 抽象处理者
public abstract class Handler {
protected Handler nextHandler;

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

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

2. 实现具体处理者

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
// 具体处理者A:权限校验
public class AuthHandler extends Handler {
@Override
public void handleRequest(String request) {
if (request.equals("Auth")) {
System.out.println("AuthHandler: Processing authentication.");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}

// 具体处理者B:数据验证
public class ValidationHandler extends Handler {
@Override
public void handleRequest(String request) {
if (request.equals("Validation")) {
System.out.println("ValidationHandler: Processing data validation.");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}

// 具体处理者C:业务处理
public class BusinessHandler extends Handler {
@Override
public void handleRequest(String request) {
if (request.equals("Business")) {
System.out.println("BusinessHandler: Processing business logic.");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}

3. 客户端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Client {
public static void main(String[] args) {
// 创建处理者对象
Handler authHandler = new AuthHandler();
Handler validationHandler = new ValidationHandler();
Handler businessHandler = new BusinessHandler();

// 设置责任链
authHandler.setNextHandler(validationHandler);
validationHandler.setNextHandler(businessHandler);

// 向责任链发送请求
authHandler.handleRequest("Validation"); // 输出: ValidationHandler: Processing data validation.
authHandler.handleRequest("Business"); // 输出: BusinessHandler: Processing business logic.
authHandler.handleRequest("Auth"); // 输出: AuthHandler: Processing authentication.
}
}

4. 运行结果

1
2
3
ValidationHandler: Processing data validation.
BusinessHandler: Processing business logic.
AuthHandler: Processing authentication.

4. 责任链模式的优点

  • 降低耦合度:请求的发送者与接收者解耦,发送者不需要知道是谁处理了请求,也不需要知道处理的顺序。这样可以将多个处理器对象连接起来,形成一条责任链,每个对象只需要关注自己要处理的请求。
  • 增强灵活性:通过改变链中的处理者或改变它们的顺序,责任链模式可以动态地修改处理请求的逻辑。
  • 增加可扩展性:可以通过增加新的处理者类来扩展责任链,新的处理者可以轻松地插入链中,处理新的请求类型。

5. 责任链模式的缺点

  • 性能问题:如果链条过长,可能导致请求的处理需要经过多个处理对象,增加系统的处理时间,降低性能。
  • 不保证请求一定被处理:如果没有任何处理者处理请求,可能会导致请求被忽略,这在某些情况下可能会带来问题。