观察者模式的策略是什么?

3

我希望为日志系统使用观察者模式。

我们有logObserverslogObservables

将要记录某些内容的类将实现iLogObservable并包含以下方法:

private $logObservers = array();

public function addLogObserver($logObserver) {
    $this->logObservers[] = $logObserver;
}
public function removeLogObserver($logObserver) {
    this->logObservers[] = $logObserver;
}
public function write($type, $message) {
    foreach($this->logObservers as $logObserver) {
        $logObserver->log($level, $message);
    }
}

然后我注意到,很多将使用日志记录的类都具有这些方法,我必须复制并粘贴。因此,是否更好地将这些方法放在我称之为LogObservableLog的类中,然后使用策略(在所有需要记录日志的类中实例化此类)。当我更改Log中的方法时,所有的logObservables都会受到影响。

然而,我还没有看到任何人将观察者模式与策略模式结合使用,但它似乎非常有效,并且可以消除冗余。

你认为呢?

2个回答

2

在支持多重继承的语言中,支持此功能的对象通常会从支持这些方法的Observable类继承。

我从未遇到过使用聚合来支持此功能的解决方案,这就是你所描述的,但考虑到PHP不支持多重继承,这听起来对我来说是一个合理的解决方法。


PHP不支持多重继承。我只能扩展一次。这就是你所指的吗?但如果我使用“extend”,它就不能再扩展其他类了,而需要日志记录的类通常会扩展其他类。我想我不能仅因为一个类需要日志记录功能就扩展LogObservable,否则所有类都将扩展这个类,因此无法扩展其他类。 - never_had_a_name
Fayer,没错。在许多其他编程语言中(例如C++、Python和可以争议的Java),您可以从多个类扩展,这对于此场景非常完美。然而,在PHP中,您不能这样做,因此采用聚合而不是继承(正如您所描述的)是次佳解决方案。我不会将其描述为“策略模式”,因为没有一堆可能被聚合的替代方案 - 只有一个。 - Oddthinking
我猜那就是唯一的方法了 :) - never_had_a_name

0
现在您可以使用Traits并在一个Trait中定义observerAbles方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接