观察者模式的策略?

观察者模式的策略?

问题描述:

我想为观察系统使用观察者模式。观察者模式的策略?

我们有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); 
    } 
} 

然后我注意到,那很多的,将使用日志记录都将具有这些方法,我要复制粘贴类。所以是不是最好有一类我称之为LogObservable或者只是Log,然后使用这些策略的方法(实例化将记录所有类中的这个类)。当我更改Log中的方法时,所有logObservables都将受到影响。

不过,我还没有看到任何人因使用与策略模式观察者模式还,但它似乎是非常有效的去除重复。

您认为如何?

这是不寻常的支持此功能,从可观察到的类,它支持这些方法,在支持多重继承的语言继承的对象。

我从来没有碰到过,使用聚合来支持这一点,这是你所描述的一个解决方案,但由于PHP不支持多重继承,这听起来像一个合理的变通给我。现在

+0

php不支持多重继承。我只能延长一次。那是你所指的?但如果我使用“扩展”,它不能再扩展其他类,而需要日志的类通常会扩展其他类。我想我不能扩展LogObservable只是因为一个类需要日志记录功能,然后所有的类将扩展这个,因此不能扩展其他。 – 2010-05-06 13:41:15

+0

Fayer,对。在许多其他语言中(例如C++,Python和可论证的Java),您可以从多个类中扩展,这对于这种情况来说非常合适。但是,你不能在PHP中,所以使用聚合而不是(如你所描述的)是第二好的解决方案。但我不会将其描述为“战略模式”,因为没有一系列可以汇总的替代方案 - 仅此一项。 – Oddthinking 2010-05-06 14:04:32

+0

我想它是唯一的方法:) – 2010-05-06 14:11:18

可以使用性状与一个特质定义observerAbles方法。