共计 2625 个字符,预计需要花费 7 分钟才能阅读完成。
内容目录
概述
专业描述
责任链模式(Chain of Respopattern-nsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
普通描述
多个对象都有处理的机会,执行流程按照特定的链条传递该请求,直到有一个对象被处理。
UML(来源网络)
经典场景
- js 原型链
- jsDom 中的事件冒泡
优缺点
优点
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
缺点
- 不能保证请求一定被接收。
代码实现
案例以 java 设计模式中的经典案例日志中间件 AbstractLogger 为例,采用 typeScript 编码实现
- 创建抽象的记录器类。
abstract class AbstractLogger {
static INFO : number = 1;
static DEBUG : number = 2;
static ERROR : number = 3;
protected level : number;
// 责任链中的下一个元素
protected nextLogger : AbstractLogger;
public setNextLogger(nextLogger: AbstractLogger){this.nextLogger = nextLogger;}
public logMessage(level: number, message: string){if(this.level <= level){this.write(message);
}
if(this.nextLogger !=null){this.nextLogger.logMessage(level, message);
}
}
protected abstract write(message: string);
}
-
创建扩展了该记录器类的实体类。
class ConsoleLogger extends AbstractLogger {constructor(level : number){super() this.level = level; } write(message: string) {console.log("Standard Console::Logger: " + message); } }
class ErrorLogger extends AbstractLogger {
constructor(level: number){super()
this.level = level;
}
write(message: string) {console.log("Error Console::Logger: " + message);
}
}
class FileLogger extends AbstractLogger {
constructor(level: number){super()
this.level = level;
}
write(message: string) {console.log("File::Logger: " + message);
}
}
3. 构建职责链
创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。最后构建的职责链:```info
errorLogger(ERROR 级别) ==> fileLogger(DEBUG 级别) ==> consoleLogger(INFO 级别)
class ChainPattern{static getChainOfLoggers() : AbstractLogger{let errorLogger = new ErrorLogger(AbstractLogger.ERROR);
let fileLogger = new FileLogger(AbstractLogger.DEBUG);
let consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
errorLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(consoleLogger);
return errorLogger;
}
}
代码测试
测试用例
## 实例化 Logger
let loggerChain = ChainPattern.getChainOfLoggers();
## ① 下一步为空 执行 consoleLogger(INFO 级别) 日志记录操作
loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
## ② 下一步 fileLogger(DEBUG 级别) 日志记录操作 再下一步 consoleLogger(INFO 级别) 日志记录操作
loggerChain.logMessage(AbstractLogger.DEBUG, "This is an debug level information.");
## ③ 下一步 errorLogger(ERROR 级别) 日志记录操作 再下一步 fileLogger(DEBUG 级别) 日志记录操作 再下一步 consoleLogger(INFO 级别) 日志记录操作
loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");
测试结果
## ① 操作结果
Standard Console::Logger: This is an information.
## ② 操作结果
File::Logger: This is an debug level information.
Standard Console::Logger: This is an debug level information.
## ③ 操作结果
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.
Process finished with exit code 0
正文完