职责链模式
职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。每个处理者都包含对下一个处理者的引用,形成一个链条。
职责链模式的主要角色包括:
-
抽象处理者(Handler): 定义了处理请求的接口,通常包含一个指向下一个处理者的引用。
-
具体处理者(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
是抽象处理者,包含了对下一个处理者的引用和一个处理请求的方法。ConcreteHandlerA
和 ConcreteHandlerB
是具体处理者,分别处理请求 'A' 和 'B'。客户端代码创建了一个处理者链,请求从 handlerA
开始,如果它不能处理请求,则传递给 handlerB
。
职责链模式的优点包括:
- 解耦发送者和接收者: 发送者无需知道请求的具体接收者,而接收者也无需知道请求的发送者。
- 灵活性: 可以灵活地增加、删除或更改处理者,而不影响其他部分的代码。
- 可动态配置: 客户端可以动态配置职责链,改变处理请求的顺序。
职责链模式通常在处理复杂请求的场景中使用,其中一个请求可能需要多个对象来处理。