2010-08-30 46 views
4

我需要的情況下一些實際的例子當開發一個網站的時候。(使用PHP)何時在開發網站時使用觀察者模式?

我有我可以使用觀察者模式的一個「當用戶發佈的文章(主題),類RSS和類EMAIL(觀察員)將修改rss併發送電子郵件給管理員「,但我甚至不知道這是否是一個好例子。

你在哪裏使用觀察者模式?

BTW:這不是一門功課,我只是躺在這裏想着這個模式:)

EDITED 我更好奇「什麼時候做」,而不是「如何做它「

回答

2

我有一個對象(單元格)的集合(數組)作爲」cellCollection「對象的屬性。爲了減少內存使用量,每個單元格實際上都是以緩存(磁盤文件,APC,memcache等)的序列化形式保存的,而「cellCollection」對象保存指向緩存位置的指針數組。我使用observer模式,以便每當「cell」對象被修改時通知「cellCollection」對象,以便它可以更新緩存中該「cell」對象的主副本,並根據需要調整其指針。

+0

我migath聽起來像一個noob在這裏,但...你可以做到這一點在PHP?緩存中需要什麼樣的數據?你有鏈接,我可以學習這樣做嗎? – pleasedontbelong 2010-08-30 22:14:11

+0

是的,你可以用PHP來完成,否則我將無法做到!有問題的應用程序是PHPExcel,其中Excel工作表可以包含數千個單元,其中每個單元都是由工作表的cellCollection對象引用的對象。一些關於使用觀察者模式的文章:http://www.devshed.com/c/a/PHP/An-Introduction-to-the-Observer-Pattern-in-PHP/或http://devzone.zend .com/article/5或http://gauravjassal.com/php/observer-pattern-in-php-part-1/ – 2010-08-30 23:30:31

1

您通常不需要多或少無狀態PHP的觀察者模式。

但是,請考慮以下內容。我跳過了一些代碼,但你應該可以填寫空白。

class Stats extends Observer implements SplObserver 
{ 
    private function updateStats($action) { } 
    public function update(SplSubject $subject) 
    { 
     if ($subject instanceOf Article) 
     { 
      if ($subject->notice == Article::NOTICE_POSTED_ARTICLE) 
      { 
       $this->updateStats($subject->notice); 
      } 
     } 
    } 
} 

class Article extends Subject implements SplSubject 
{ 
    const NOTICE_POSTED_ARTICLE = "Article Posted"; 

    private $observers; 
    public $notice; 

    public function postArticle($text) 
    { 
     $this->notice = self::NOTICE_POSTED_ARTICLE; 
     $this->notify(); 
    } 

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

因爲你的類文章擴展了「Subject」,如果notify()不會更好, $ observers和$ notice在父類中的位置? 無論如何它作爲一個例子,thxs – pleasedontbelong 2010-08-30 22:19:34

0

我每次發生「行動」時都會使用它。這些東西包括每種實體(用戶,內容,標籤等)的基本CRUD,但包括許多其他操作(用戶登錄,用戶註銷,模塊加載,模塊退出等)。

我還喜歡在東西被加載之後,或者在東西被保存(插入或更新到數據庫)之前,或者在東西(例如表單)被渲染以改變數據結構之前,使用Visitor模式。

操作可能會在頁面加載中發生多次。