国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

php面向對象:觀察者模式示例

2024-09-04 11:43:48
字體:
來源:轉載
供稿:網(wǎng)友

觀察者模式也是php面向對象中的一個不常用的模式了,下面我們一起來看看php面向對象:觀察者模式示例,希望對給各位帶來幫助.

意圖:定義對象間的一種一對多的依賴關系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新【GOF95】,又稱為發(fā)布-訂閱(Publish-Subscribe)模式、模型-視圖(Model-View)模式、源-監(jiān)聽(Source-Listener)模式、或從屬者(Dependents)模式.

主要角色:抽象主題(Subject)角色:主題角色將所有對觀察者對象的引用保存在一個集合中,每個主題可以有任意多個觀察者,抽象主題提供了增加和刪除觀察者對象的接口.

抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在觀察的主題發(fā)生改變時更新自己.

具體主題(ConcreteSubject)角色:存儲相關狀態(tài)到具體觀察者對象,當具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知,具體主題角色通常用一個具體子類實現(xiàn).

具體觀察者(ConcretedObserver)角色:存儲一個具體主題對象,存儲相關狀態(tài),實現(xiàn)抽象觀察者角色所要求的更新接口,以使得其自身狀態(tài)和主題的狀態(tài)保持一致.

優(yōu)點和缺點

優(yōu)點:觀察者和主題之間的耦合度較小,支持廣播通信.

缺點:由于觀察者并不知道其它觀察者的存在,它可能對改變目標的最終代價一無所知,這可能會引起意外的更新.

適用場景

當一個抽象模型有兩個方面,其中一個方面依賴于另一個方面,當對一個對象的改變需要同時改變其它對象,而不知道具體有多少個對象待改變.

當一個對象必須通知其它對象,而它又不能假定其它對象是誰,換句話說,你不希望這些對象是緊密耦合的.實現(xiàn)代碼:

  1. <?php 
  2.  
  3. /** 
  4. * 觀察者模式 
  5.  
  6. * @package design pattern 
  7. */ 
  8.  
  9. /** 
  10. * 抽象主題角色 
  11. */ 
  12. interface Subject { 
  13.  
  14.     /** 
  15.      * 增加一個新的觀察者對象 
  16.      * @param Observer $observer 
  17.      */ 
  18.     public function attach(Observer $observer); 
  19.  
  20.     /** 
  21.      * 刪除一個已注冊過的觀察者對象 
  22.      * @param Observer $observer 
  23.      */ 
  24.     public function detach(Observer $observer); 
  25.  
  26.     /** 
  27.      * 通知所有注冊過的觀察者對象 
  28.      */ 
  29.     public function notifyObservers(); 
  30.  
  31. /** 
  32. * 具體主題角色 
  33. */ 
  34. class ConcreteSubject implements Subject { 
  35.  
  36.     private $_observers
  37.  
  38.     public function __construct() { 
  39.         $this->_observers = array(); 
  40.     } 
  41.  
  42.     /** 
  43.      * 增加一個新的觀察者對象 
  44.      * @param Observer $observer 
  45.      */ 
  46.     public function attach(Observer $observer) { 
  47.         return array_push($this->_observers, $observer); 
  48.     } 
  49.  
  50.     /** 
  51.      * 刪除一個已注冊過的觀察者對象 
  52.      * @param Observer $observer 
  53.      */ 
  54.     public function detach(Observer $observer) { 
  55.         $index = array_search($observer$this->_observers); 
  56.         if ($index === FALSE || ! array_key_exists($index$this->_observers)) { 
  57.             return FALSE; 
  58.         } 
  59.  
  60.         unset($this->_observers[$index]); 
  61.         return TRUE; 
  62.     } 
  63.  
  64.     /** 
  65.      * 通知所有注冊過的觀察者對象 
  66.      */ 
  67.     public function notifyObservers() { 
  68.         if (!is_array($this->_observers)) { 
  69.             return FALSE; 
  70.         } 
  71.  
  72.         foreach ($this->_observers as $observer) { 
  73.             $observer->update(); 
  74.         } 
  75.  
  76.         return TRUE; 
  77.     } 
  78.  
  79.  
  80. /** 
  81. * 抽象觀察者角色 
  82. */ 
  83. interface Observer { 
  84.  
  85.     /** 
  86.      * 更新方法 
  87.      */ 
  88.     public function update(); 
  89.  
  90. class ConcreteObserver implements Observer { 
  91.  
  92.     /** 
  93.      * 觀察者的名稱 
  94.      * @var <type> 
  95.      */ 
  96.     private $_name
  97.  
  98.     public function __construct($name) { 
  99.         $this->_name = $name
  100.     } 
  101.  
  102.     /** 
  103.      * 更新方法 
  104.      */ 
  105.     public function update() { 
  106.         echo 'Observer'$this->_name, ' has notified.<br />'
  107.     }  //開源軟件:Vevb.com 
  108.  
  109.  
  110.    $subject = new ConcreteSubject(); 
  111.  
  112.         /* 添加第一個觀察者 */ 
  113.         $observer1 = new ConcreteObserver('Martin'); 
  114.         $subject->attach($observer1); 
  115.  
  116.         echo '<br /> The First notify:<br />'
  117.         $subject->notifyObservers(); 
  118.  
  119.         /* 添加第二個觀察者 */ 
  120.         $observer2 = new ConcreteObserver('phppan'); 
  121.         $subject->attach($observer2); 
  122.  
  123.         echo '<br /> The Second notify:<br />'
  124.         $subject->notifyObservers(); 
  125.  
  126.         /* 刪除第一個觀察者 */ 
  127.         $subject->detach($observer1); 
  128.  
  129.         echo '<br /> The Third notify:<br />'
  130.         $subject->notifyObservers(); 
  131. ?>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇雄县| 海淀区| 东平县| 三门峡市| 云林县| 扬中市| 时尚| 神农架林区| 阿克| 日喀则市| 柳州市| 恭城| 灌云县| 和静县| 肥城市| 修文县| 平乐县| 龙江县| 龙口市| 永吉县| 弥勒县| 绍兴县| 丹巴县| 洛阳市| 北川| 环江| 德惠市| 合川市| 大荔县| 高邮市| 威海市| 蒙山县| 永定县| 涡阳县| 舞阳县| 和硕县| 阳信县| 桓仁| 乾安县| 保山市| 巨鹿县|