装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象包装在装饰器类中来动态地添加新行为或责任,而无需修改其原始类的代码。这个模式通过将对象与其装饰器进行组合,可以在运行时增强对象的功能。
装饰器模式的主要思想是创建一组装饰器类,这些装饰器类与原始类共享一个公共接口。每个装饰器类添加一些额外的行为或功能,这些装饰器可以以任意顺序堆叠在一起,以形成复杂的对象行为。
场景
动态扩展对象功能:当需要为对象动态添加功能,而且这些功能可以以不同的组合方式应用于对象时,装饰器模式非常有用。
避免类爆炸:当类的组合可能导致类数量急剧增加时,装饰器模式允许你将组合逻辑从类的继承层次结构中抽离出来。
保持开放封闭原则:装饰器模式符合开放封闭原则,即对扩展开放,对修改封闭,因为你可以添加新的装饰器而不必修改原始类。
实现
// 原始文本日志类
class TextLogger {
log(message) {
console.log(`Log: ${message}`);
}
}
// 基础装饰器类
class LoggerDecorator {
constructor(logger) {
this.logger = logger;
}
log(message) {
this.logger.log(message);
}
}
// 装饰器类1,添加时间戳
class TimestampLogger extends LoggerDecorator {
log(message) {
const timestamp = new Date().toLocaleString();
this.logger.log(`[${timestamp}] ${message}`);
}
}
// 装饰器类2,添加日志级别
class LogLevelLogger extends LoggerDecorator {
log(message, level) {
this.logger.log(`[${level}] ${message}`);
}
}
// 创建基本日志对象
const textLogger = new TextLogger();
textLogger.log("Message without decoration");
// 创建带时间戳的日志对象
const timestampLogger = new TimestampLogger(textLogger);
timestampLogger.log("Message with timestamp");
// 创建带时间戳和日志级别的日志对象
const logLevelLogger = new LogLevelLogger(timestampLogger);
logLevelLogger.log("Message with timestamp and log level", "INFO");
在上面的示例中,TextLogger 是原始文本日志类,它只能记录基本的日志信息。通过创建装饰器类 LoggerDecorator,可以动态添加额外的功能。TimestampLogger 和 LogLevelLogger 是两个装饰器类,它们分别添加时间戳和日志级别功能。
通过使用装饰器模式,可以轻松扩展文本日志功能,而不必修改原始类。这使得代码更具灵活性,可以根据需要组合不同的装饰器,以满足不同的日志需求。