2011-04-19 67 views
0

我有一種情況,我認爲Observer pattern最適合使用,但我不確定實施的最佳方式。我應該使用觀察者模式嗎?

說我有2個表

User 
    id 
    name 
    email 
    ... 
Order 
    id 
    user_id 
    total 
    ... 

,其從ORM延伸兩者都類,父類具有保存()方法

class User extends ORM { } 

$user = new User(1); 
$user->name = 'New Name' 
$user->save();

我也有一個xml feed,它存儲用戶的一些列和來自訂單的一些列。當第一次訪問feed時,它會從數據庫中提取所需的信息,並生成一個xml feed,並將這些對象存儲在memcached中。任何後續的提要命中都會從memcached中提取。

我想要做的是,如果某些字段以用戶或順序更改,我想更新memcached密鑰。由於我沒有存儲所有來自用戶的字段或所有來自訂單的字段,我不希望它發生在任何save()調用(也是,xml生成腳本有點db密集)

從閱讀關於觀察者模式,我在想用戶/訂單對象也會實現SplSubject,並在其構造函數,附加一個XMLObserver。我將不得不重寫save()方法來通知任何附加的觀察者。如果某些字段發生更改,我只會打電話通知。 XMLObserver會更新memcached。

class User extends ORM implements SplSubject 
{ 
    private $observers = array(); 

    function __construct() 
    { 
     $this->attach(new XMLObserver); 
     parent::__construct(); 
    } 

    function attach(SplObserver $observer) 
    { 
     $id = spl_object_hash($observer); 
     $this->observers[$id] = $observer; 
    } 

    function detach(SplObserver $observer) 
    { 
     $id = spl_object_hash($observer); 
     unset($this->observers[$id]); 
    } 

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

    function save() 
    { 
     if (in_array($this->changed, array('name')) { 
     $this->notify(); 
     } 
     parent::save(); 
    } 
} 

class XMLObserver implements SplObserver 
{ 
    function update(SplSubject $subject) 
    { 
     // code here to update memcached key 
    } 
}

我不確定這是否對我最有意義。根據我到目前爲止,爲什麼我不會基於這些字段是否被更改而調用靜態方法(如XMLFeed::update($key))。我真的沒有看到如何使用觀察員是有益的,但我可能會以這種錯誤的方式去做。

任何人都知道處理此問題的最佳方法?

+0

我不知道我完全理解你的問題,但memcache真的是你唯一的觀察者,還是memcache中有多個觀察者?有沒有這種XML Feed的各種實例,或者只有當其中的字段發生更改時才需要進行更新? – KTF 2011-04-19 13:54:51

+0

目前沒有其他觀察者設置,所以如果我實現了這一點,memcache將是我唯一的觀察者。這也是notify()調用中的一個錯誤。我需要在save()之後調用notify(),但是我不能訪問$ this-> changed,因爲在保存 – poops 2011-04-19 14:01:09

+0

之後,它會被清除,只有這個xml feed的實例纔會更新,對於每個用戶對象 – poops 2011-04-19 14:01:49

回答

0

根據我們的評論,也許你應該考慮編寫一個函數,確定是否應該將更改傳播到memcache(取決於被更改的字段),而不是使用觀察者模式。

由於memcache將是您唯一的訂閱者,需要始終訂閱,我不認爲您會從這種模式的好處中受益匪淺。來自http://www.research.ibm.com/designpatterns/example.htm

觀察者模式可以讓您獨立地更改 主題和觀察者。 您可以重複使用主題,而不用重複使用其觀察者,反之亦然。它 可讓您添加觀察者,而不需要修改觀察者或其他 觀察員。

還有其他的好處,但我不認爲你會從你的場景中得到很多好處。

+0

是的,我原本以爲觀察者是我應該使用的,因爲memcached會在主體改變時更新,但由於我不能修改主題,所以我可能不應該使用它。謝謝您的幫助! – poops 2011-04-19 14:28:48

+0

很高興爲您提供幫助。 :) – KTF 2011-04-19 15:25:00