职责链模式是一种行为设计模式,它使多个对象有机会按顺序处理请求,从而避免请求的发送者和接收者之间的直接耦合。每个对象都包含对下一个对象的引用,如果一个对象不能处理请求,则会将请求传递给链中的下一个对象,直到请求被处理或者到达链的末尾。
核心概念
- 处理者(Handler): 定义了处理请求的接口,并且持有一个指向下一个处理者的引用。
- 具体处理者(Concrete Handler): 实现处理者接口,可以处理请求,也可以选择将请求传递给链中的下一个处理者。
- 客户端(Client): 创建处理者链,并向链中的第一个处理者提交请求。
JavaScript 示例
假设我们有一个简单的日志记录系统,不同级别的日志(如DEBUG, INFO, WARNING, ERROR)需要被不同的处理器处理,我们可以使用职责链模式来实现这个需求。
class LogHandler {
constructor(nextHandler) {
this.nextHandler = nextHandler;
}
log(message, level) {
if (this.nextHandler) {
return this.nextHandler.log(message, level);
}
return `No handler for log level: ${level}`;
}
}
class DebugLogHandler extends LogHandler {
log(message, level) {
if (level === 'DEBUG') {
console.log(`DEBUG: ${message}`);
return;
}
return super.log(message, level);
}
}
class InfoLogHandler extends LogHandler {
log(message, level) {
if (level === 'INFO') {
console.log(`INFO: ${message}`);
return;
}
return super.log(message, level);
}
}
class WarningLogHandler extends LogHandler {
log(message, level) {
if (level === 'WARNING') {
console.log(`WARNING: ${message}`);
return;
}
return super.log(message, level);
}
}
class ErrorLogHandler extends LogHandler {
log(message, level) {
if (level === 'ERROR') {
console.log(`ERROR: ${message}`);
return;
}
return super.log(message, level);
}
}
// 使用示例
const debugHandler = new DebugLogHandler();
const infoHandler = new InfoLogHandler(debugHandler);
const warningHandler = new WarningLogHandler(infoHandler);
const errorHandler = new ErrorLogHandler(warningHandler);
// 客户端代码
errorHandler.log("This is an error message", "ERROR"); // 输出:ERROR: This is an error message
errorHandler.log("This is an info message", "INFO"); // 输出:INFO: This is an info message
errorHandler.log("This is a debug message", "DEBUG"); // 输出:DEBUG: This is a debug message
errorHandler.log("This is a strange message", "STRANGE"); // 输出:No handler for log level: STRANGE
在这个例子中,我们定义了一个基本的LogHandler
类,它包含一个指向下一个处理者的引用。然后我们创建了四个具体处理者类,每个类负责处理不同级别的日志。客户端代码创建了一个处理者链,当请求(即日志消息)被提交给链的第一个处理者(errorHandler
)时,它会根据日志级别逐级处理或传递给下一个处理者,直到找到合适的处理者或链结束。如果没有任何处理者能处理请求,最后一个处理者会返回一个默认的提示信息。这种方式使得日志处理系统灵活且易于扩展,新的日志级别只需添加新的处理者类并插入链中即可。