2011-01-28 216 views
1

試圖找到一個這樣的例子,可能是我沒有采取正確的方式,或者我的思想過於簡化了觀察者模式的概念。觀察員可以觀察多個可觀察物嗎?

我想創建一個控制來自Web服務的消息的類,並且我希望這個類監視許多其他操作的更改。

我看過的觀察者模式示例演示了許多觀察者在觀察單個可觀察的事物,我可以(或者應該)以相反的方式做到這一點嗎?我還應該做什麼?

回答

4

只在許多Oservable實例中註冊一個Observer實例。

無論何時Observable更新,您可能都希望將Observable實例傳遞給Observer,以便Observer知道哪個特定對象更新了它。

一個簡單的例子:

interface Observer { 
    public update(Observable $observable); 
} 

class Observable() { 
    private $observers = array(); 

    public function register(Observer $observer) { 
    $this->observers[] = $observer; 
    } 

    public function update() { 
    foreach($observers as $observer) { 
     $observer->update($this); 
    } 
    } 
} 

$observer = new ObserverImplementation(); 

$observable1->register($observer); 
$observable2->register($observer); 

$observable1->update(); 
$observable2->update(); 

你也可能要查找the Mediator pattern

這裏是相當不錯的執行它:Symfony Event Dispatcher

0

這當然是可行的。所有你需要做的是通過添加一個參數到oberver函數/方法指向可觀察。

3

我認爲記住設計模式是建議而非絕對是非常重要的。如果他們可以修改以更好地適應您的需求,那麼他們應該。

是的,在這種情況下,它絕對可以做到。你的觀察者只需要註冊多個可觀察對象。

當您的某個可觀察對象將通知其觀察者時,它將簡單地循環引用列表以指示其更新。如果這些引用與其他可觀察對象共享,則無關緊要。

0

我訂閱的1類執行1個核心任務的想法。如果是我,我會建立一個觀察者接口,創建多個觀察者實現,並用一些ObserverManager類來管理所有這些觀察者。

這樣做會分離您的所有業務問題,並將提供更精細的測試級別。

除非「許多其他操作的變化」可以表示爲同一種可觀察的「變化」。在這一點上,單一的觀察者是有道理的。

1

從GoF(觀察者模式的實現部分),「觀察多個主題。在某些情況下,觀察者可能依賴於多個主題是有意義的。例如,電子表格可能取決於不止一個數據源,在這種情況下,需要擴展Update接口,讓觀察者知道哪個主體正在發送通知,主體可以簡單地將自己作爲參數傳遞給Update操作,從而讓觀察者知道哪個主體檢查。」

Mchl的答案已經包含了這個例子。我只是在GoF中添加引用,如果您需要這樣做,這不會是一個壞習慣。