使用装饰器模式来扩展一个日志记录器:
代码语言:javascript复制interface LoggerInterface {
public function log($message);
}
class FileLogger implements LoggerInterface {
public function log($message) {
echo "Logging to file: $messagen";
}
}
abstract class LoggerDecorator implements LoggerInterface {
protected $logger;
public function __construct(LoggerInterface $logger) {
$this->logger = $logger;
}
public function log($message) {
$this->logger->log($message);
}
}
class TimeStampLogger extends LoggerDecorator {
public function log($message) {
$this->logger->log('[' . date('Y-m-d H:i:s') . '] ' . $message);
}
}
class LogLevelLogger extends LoggerDecorator {
public function log($message) {
$this->logger->log('[INFO] ' . $message);
}
}
在上面的代码中,我们定义了一个名为 LoggerInterface 的接口,它有一个名为 log 的方法。我们还定义了一个名为 FileLogger 的具体实现,它实现了 LoggerInterface 接口,并使用 echo 语句输出日志消息。
然后我们定义了一个名为 LoggerDecorator 的抽象装饰器类,它扩展了 LoggerInterface 接口。在 LoggerDecorator 类中,我们有一个名为 $logger 的成员变量,它用于存储被装饰的日志记录器。我们还实现了 log 方法,该方法调用被装饰的日志记录器的 log 方法。
接着,我们定义了一个名为 TimeStampLogger 的具体装饰器类,它扩展了 LoggerDecorator 类。在 TimeStampLogger 类中,我们重写了 log 方法,该方法在消息前面添加了一个时间戳。
最后,我们定义了一个名为 LogLevelLogger 的具体装饰器类,它扩展了 LoggerDecorator 类。在 LogLevelLogger 类中,我们重写了 log 方法,该方法在消息前面添加了一个日志级别 INFO。
下面是如何使用这些类的示例:
代码语言:javascript复制$logger = new FileLogger();
$logger = new TimeStampLogger($logger);
$logger = new LogLevelLogger($logger);
$logger->log('Hello World!');
在上面的代码中,我们首先创建了一个具体的日志记录器 FileLogger。然后我们使用 TimeStampLogger 对象来扩展 FileLogger 的功能,并将其存储在 $logger 变量中。接着,我们使用 LogLevelLogger 对象来进一步扩展 $logger 的功能,并将其存储在 $logger 变量中。最后,我们调用 $logger 的 log 方法来执行装饰后的操作。
当我们运行上面的示例代码时,我们会看到以下输出:
代码语言:javascript复制Logging to file: [INFO] [2023-04-28 10:30:00] Hello World!
在这里,我们可以看到我们成功地使用装饰器模式来扩展了 FileLogger 的功能。使用 TimeStampLogger 和 LogLevelLogger 装饰器类,我们可以将消息的时间戳和日志级别添加到日志消息前面,以增强日志记录器的功能。