设计模式 职责链模式

本文将介绍设计模式中的职责链模式。

一、什么职责链模式?

职责链模式适用于这样一种情况:可以处理请求的对象不止一个,并且这些对象组成了链式结构。

例如:

请求 - 一级审核员、二级审核员、三级审核员

职责链模式将请求的处理者串联成一条职责链,请求会在职责链中传递并处理。

二、实现

1. 结构

2. 角色

  • Handler 抽象处理者:
    • 定义了处理请求的方法
    • 维护了一个类型为 Handler 的对象,它即是职责链的下家
  • ConcreteHandler 具体处理者:
    • 抽象处理者的子类
    • 在处理请求的方法中,判断自身是否有处理权限,
      • 如果有,处理
      • 否则,将请求转发给下家

3. 简单示例

Handler:

1
2
3
4
5
6
7
8
9
10
11
public abstract class Handler {
/**
* 职责链的下家
*/
protected Handler next;

/**
* 处理请求
*/
public abstract void handle(String request);
}

ConcreteHandler:

1
2
3
4
5
6
7
8
9
10
public class ConcreteHandler extends Handler {
public void handle(String request) {
if (可以处理) {
// ···处理···
} else {
// 向职责链的下家转发
this.next.handle(request);
}
}
}

客户端:

职责链模式本身不负责创建职责链,职责链的创建工作应该由客户端负责

1
2
3
4
5
6
7
8
9
// 创建职责链
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
Handler handlerC = new ConcreteHandlerC();
handlerA.setNext(handlerB);
handlerB.setNext(handlerC);

// 发送请求
handlerA.handle(···);

三、纯粹与否

1. 纯粹版

处理者处理请求时,只能在 “处理” 和 “转发” 中二选一。

2. 不纯粹版

处理者处理请求时,可以 “处理”,可以 “转发”,也可以 “处理后转发”。

四、优缺点

1. 优点

  • 客户端不需要关心请求具体会被哪个处理者处理,只需要将请求丢给职责链即可
  • 请求者只需维持下家的引用,从而简化了职责链的关系安排

2. 缺点

  • 请求可能因为职责链未正确配置而无法正确被处理
  • 如果建链不当,可能导致循环调用

参考

  • 《Java 设计模式》