跳到主要内容

职责链模式

职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。每个处理者都包含对下一个处理者的引用,形成一个链条。

职责链模式的主要角色包括:

  1. 抽象处理者(Handler): 定义了处理请求的接口,通常包含一个指向下一个处理者的引用。

  2. 具体处理者(Concrete Handler): 实现了抽象处理者接口,负责处理请求。如果能够处理请求,则处理;否则,将请求传递给下一个处理者。

以下是一个简单的 JavaScript 示例,演示了职责链模式:

// 抽象处理者
class Handler {
constructor() {
this.successor = null;
}

setSuccessor(successor) {
this.successor = successor;
}

handleRequest(request) {
if (this.successor) {
this.successor.handleRequest(request);
}
}
}

// 具体处理者A
class ConcreteHandlerA extends Handler {
handleRequest(request) {
if (request === 'A') {
console.log('Handler A handles the request.');
} else {
super.handleRequest(request);
}
}
}

// 具体处理者B
class ConcreteHandlerB extends Handler {
handleRequest(request) {
if (request === 'B') {
console.log('Handler B handles the request.');
} else {
super.handleRequest(request);
}
}
}

// 客户端代码
const handlerA = new ConcreteHandlerA();
const handlerB = new ConcreteHandlerB();

handlerA.setSuccessor(handlerB);

handlerA.handleRequest('A');
// Output: Handler A handles the request.

handlerA.handleRequest('B');
// Output: Handler B handles the request.

handlerA.handleRequest('C');
// Output: (No handler can handle the request.)

在这个例子中,Handler 是抽象处理者,包含了对下一个处理者的引用和一个处理请求的方法。ConcreteHandlerAConcreteHandlerB 是具体处理者,分别处理请求 'A' 和 'B'。客户端代码创建了一个处理者链,请求从 handlerA 开始,如果它不能处理请求,则传递给 handlerB

职责链模式的优点包括:

  • 解耦发送者和接收者: 发送者无需知道请求的具体接收者,而接收者也无需知道请求的发送者。
  • 灵活性: 可以灵活地增加、删除或更改处理者,而不影响其他部分的代码。
  • 可动态配置: 客户端可以动态配置职责链,改变处理请求的顺序。

职责链模式通常在处理复杂请求的场景中使用,其中一个请求可能需要多个对象来处理。