PHP面向对象的设计模式-装饰器模式使用

2023-04-28 16:04:15 浏览数 (1)

使用装饰器模式来扩展一个日志记录器:

代码语言: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 装饰器类,我们可以将消息的时间戳和日志级别添加到日志消息前面,以增强日志记录器的功能。

php

0 人点赞