跳到主要内容

责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于构建一条对象链,每个对象都有机会处理请求,但如果它不能处理请求,则将请求传递给链中的下一个对象。责任链模式的目的是解耦发送者和接收者,从而允许多个对象来处理请求,而不必指定接收者。

在责任链模式中,通常有以下角色:

抽象处理者(Handler):定义了处理请求的接口,通常包含一个指向下一个处理者的引用。处理者可以决定是否处理请求,或者将请求传递给下一个处理者。

具体处理者(ConcreteHandler):实现了抽象处理者接口,具体处理者根据自己的业务逻辑来决定是否处理请求,以及是否将请求传递给下一个处理者。

场景

请求的处理涉及多个对象:当请求需要经过多个对象协同处理时,责任链模式可以用来协调处理流程。

请求发送者和接收者需要解耦:责任链模式可以帮助解耦请求发送者和接收者,使系统更具灵活性和可维护性。

动态指定处理者:责任链模式允许在运行时动态指定处理者,而无需更改客户端代码。

实现

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

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

handleRequest(request) {
if (this.canHandleRequest(request)) {
this.processRequest(request);
} else if (this.successor) {
this.successor.handleRequest(request);
}
}

canHandleRequest(request) {
throw new Error("canHandleRequest method must be overridden");
}

processRequest(request) {
throw new Error("processRequest method must be overridden");
}
}

// 具体处理者
class Manager extends PurchaseHandler {
canHandleRequest(request) {
return request.amount <= 1000;
}

processRequest(request) {
console.log(
`${this.name} approved the purchase of ${request.amount} for ${request.purpose}`
);
}
}

class Director extends PurchaseHandler {
canHandleRequest(request) {
return request.amount <= 5000;
}

processRequest(request) {
console.log(
`${this.name} approved the purchase of ${request.amount} for ${request.purpose}`
);
}
}

class VicePresident extends PurchaseHandler {
canHandleRequest(request) {
return request.amount <= 10000;
}

processRequest(request) {
console.log(
`${this.name} approved the purchase of ${request.amount} for ${request.purpose}`
);
}
}

// 请求
class PurchaseRequest {
constructor(amount, purpose) {
this.amount = amount;
this.purpose = purpose;
}
}

// 客户端代码
const manager = new Manager("Manager");
const director = new Director("Director");
const vicePresident = new VicePresident("Vice President");

manager.setSuccessor(director);
director.setSuccessor(vicePresident);

const request1 = new PurchaseRequest(800, "Office supplies");
manager.handleRequest(request1);

const request2 = new PurchaseRequest(6000, "New equipment");
manager.handleRequest(request2);

const request3 = new PurchaseRequest(12000, "Company event");
manager.handleRequest(request3);

在上面的示例中,PurchaseHandler 是抽象处理者,定义了处理请求的接口,并包含一个指向下一个处理者的引用。具体处理者如 Manager、Director 和 VicePresident 继承自抽象处理者,实现了处理请求的具体逻辑。

客户端代码创建了一个责任链,将请求依次传递给不同的处理者。每个处理者决定是否处理请求,如果不能处理请求,就将请求传递给下一个处理者。这使得请求可以在责任链中被处理,直到找到能够处理请求的处理者为止。

责任链模式有助于实现请求的动态指定处理者,并解耦请求发送者和接收者,从而提高系统的灵活性和可维护性。