2010-05-06 49 views
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); 
    } 
} 

然後我注意到,那很多的,將使用日誌記錄都將具有這些方法,我要複製粘貼類。所以是不是最好有一類我稱之爲LogObservable或者只是Log,然後使用這些策略的方法(實例化將記錄所有類中的這個類)。當我更改Log中的方法時,所有logObservables都將受到影響。

不過,我還沒有看到任何人因使用與策略模式觀察者模式還,但它似乎是非常有效的去除重複。

您認爲如何?

回答

2

這是不尋常的支持此功能,從可觀察到的類,它支持這些方法,在支持多重繼承的語言繼承的對象。

我從來沒有碰到過,使用聚合來支持這一點,這是你所描述的一個解決方案,但由於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

0

可以使用性狀與一個特質定義observerAbles方法。