1. 程式人生 > >淺談為什麼設計模式要有觀察者模式--觀察者模式的意義

淺談為什麼設計模式要有觀察者模式--觀察者模式的意義

當一個物件狀態發生改變後,會影響到其他幾個物件的改變,這時候可以用觀察者模式。像wordpress這樣的應用程式中,它容外部開發組開發外掛,比如使用者授權的部落格統計外掛、積分外掛,這時候可以應用觀察者模式,先註冊這些外掛,當用戶釋出一篇博文後,就回自動通知相應的外掛更新。

觀察者模式符合介面隔離原則,實現了物件之間的鬆散耦合。

觀察者模式UML圖:


PHP SPL中已經提供SplSubject和SqlOberver介面

  1. interface SplSubject  
  2. {  
  3.     function attach(SplObserver $observer);  //新增觀察者
  4.     function detach(SplObserver $observer);  //刪除觀察者
  5.     function notify();  //通知訊息
  6. }  
  7. interface SqlObserver  
  8. {  
  9.     function update(SplSubject $subject);  //觀察者方法
  10. }  
下面具體實現上面例子
  1. class Subject implements SplSubject  
  2. {  
  3.     private$observers;  
  4.     publicfunction attach(SplObserver $observer)  
  5.     {  
  6.         if (!in_array($observer$this->observers)) {  
  7.             $this->observers[] = $observer;  
  8.         }  
  9.     }  
  10.     publicfunction detach(SplObserver $observer)  
  11.     {  
  12.         if (false != ($index = array_search($observer$this->observers))) {  
  13.             unset($this
    ->observers[$index]);  
  14.         }  
  15.     }  
  16.     publicfunction post()  
  17.     {  
  18.         //post相關code
  19.         $this->notify();  
  20.     }  
  21.     privatefunction notify()  
  22.     {  
  23.         foreach ($this->observers as$observer) {  
  24.             $observer->update($this);  //執行觀察者實現的介面方法
  25.         }  
  26.     }  
  27.     publicfunction setCount($count)  
  28.     {  
  29.         echo"資料量加" . $count;  
  30.     }  
  31.     publicfunction setIntegral($integral)  
  32.     {  
  33.          echo"積分量加" . $integral;  
  34.     }  
  35. }  
  36. class Observer1 implements SplObserver  
  37. {  
  38.     publicfunction update($subject)  
  39.     {  
  40.         $subject-> setCount(1);  
  41.     }  
  42. }  
  43. class Observer2 implements SplObserver  
  44. {  
  45.     publicfunction update($subject)  
  46.     {  
  47.         $subject-> setIntegral(10);  
  48.     }  
  49. }  
  50. class Client  
  51. {  
  52.     publicfunction test()  
  53.     {  
  54.         $subject = new Subject();  
  55.         $subject->attach(new Observer1());  
  56.         $subject->attach(new Observer2());  
  57.         $subject->post();//輸出:資料量加1 積分量加10
  58.     }  
  59. }