摘要:設計觀察者模式是為了讓一個對象跟蹤某個狀態,知道狀態何時改變,一旦狀態改變,所有訂閱對象都能得到通知。類與觀察者設計模式沒有內在的關系,不過通過它其內置的和方法可以很方便的將觀察者實例與一個主題實例相關聯以及解除關聯。
前言
知識就是作為觀察者所獲得的結論,經過科學培訓的觀察者會為我們提供所有能感知的現實。設計觀察者模式是為了讓一個對象跟蹤某個狀態,知道狀態何時改變,一旦狀態改變,所有訂閱對象都能得到通知。如果需要保證一個狀態的一致性(比如說:狀態觸發類的應用),但是這個給定狀態可能有多個不同的用戶等級,這種情況下觀察者模式就很適用,而且很有幫助,各司其職。利用觀察者模式可以維護一致性,同時記錄創建一個給定的狀態的對象個數。
觀察者模式很直觀。何必讓多個對象創建或跟蹤一個給定的狀態呢?如果由一個對象完成這個工作,然后通知其他可能用到這個狀態的對象,這樣會合理得多。
使用SPL實現觀察者模式1、可用于觀察者設計模式的3個SPL接口/類如下:
● SplSubject
● SplObserver
● SplObjectStorage
1.1、SplSubject
注意這個SplSubject 接口指定attach()和detach()方法參數中$observer的數據類型必須是一個SplObserver 對象。
1.2、SplObserver
SplObserver 接口只有一個update()方法,如下所示:
update()方法對于觀察者模式至關重要,因為它會得到Subject狀態的最新變化,并交給觀察者實例。
1.3、SplObjectStorage
SplObjectStorage 類與觀察者設計模式沒有內在的關系,不過通過它其內置的attach()和detach()方法可以很方便的將觀察者實例與一個主題實例相關聯以及解除關聯。
storage[] = $observer; } //刪除方法 public function detach(SplObserver $observer) { if(is_int($idx = array_search($observer, $this->storage))) { unset($this->storage[$idx]); } } }注釋:如果直接用PHP類庫的SplObjectStorage類的話,1.3可以不看了,只需要把1.4里面的$this->observers = new SplObjectStorage();修改為$this->observers = new SplObjectStorage();(原因可以去了下PHP的解命名空間和文件加載機制。參考資料),notify方法里的$this->observers->storage修改為$this->observers即可。
1.4、SPL具體主題
SplSubject接口不包括獲取方法和設置方法,不過這也是觀察者設計模式中的一部分,所以需要增加獲取方法和設置方法。設置方法setData()包含一個參數,這是要增加的任何類型的數據。獲取方法getData()存儲當前的主題狀態,由具體觀察者用來更新觀察者數據。
另外還增加了setObservers()方法。并不是在構造函數中設置SplObjectStorage()實例,也沒有在setData()方法中設置觀察者實例,這里實現了一個多帶帶的setObservers()方法,可以提供更輕松的耦合,并允許有多組觀察者。observers = new SplObjectStorage(); } //添加觀察者 public function attach(SplObserver $observer) { $this->observers->attach($observer); } //剔除觀察者 public function detach(SplObserver $observer) { $this->observers->detach($observer); } //通知notify public function notify() { foreach ($this->observers->storage as $key =>$observer) { $observer->update($this); } } //設置方法 public function setData($dataNow) { $this->data=$dataNow; } //獲取方法 public function getData() { return $this->data; } } ?>1.5、SPL具體觀察者
用于實現更新函數來更新關聯的觀察者實例。
getData().""; } } ?>(附加的普通用戶具體觀察者)
1.6、SPL客戶
“SPL”Client 類只是一個標準客戶。這個客戶按照SPL接口向具體主題和觀察者發出多個請求,不過自己并沒有實現SPL類和接口。
創造新的具體觀察者,新的具體主體:"; $ob1 = new ConcreteObserver(); $ob2 = new ConcreteObserver(); $ob3 = new ConcreteObserver(); $Subject = new ConcreteSubject(); $Subject->setObservers(); $Subject->setData("這是你的數據!"); $Subject->attach($ob1); $Subject->attach($ob2); $Subject->attach($ob3); $Subject->notify(); echo "刪除ob3,結果是ob1和ob2的通知:
"; $Subject->detach($ob3); $Subject->notify(); echo "剩余的數據和附加數據還有刪除ob2,結果是ob1和ob3的通知:
"; $Subject->setData("更多的數據,只有ob1和ob3是需要的"); $Subject->attach($ob3); $Subject->detach($ob2); $Subject->notify(); echo "剩余數據和附加新數據,結果是ob1和ob3還有“新數據”的通知:
"; $Subject->attach(new commonobserverUserObserver); $Subject->notify(); } } ?>1.7、Client的調用輸出如下:
調用:$worker=new commonobserverClient();
輸出:
總結分析這里SplObjectStorage類是我自己寫的,貼出來分享一下。PHP5.1.0以及更高的版本有很多特性,其中之一就是提供了一組可以用于觀察者的設計模式的接口。可以研究一下怎么使用,SplObserver接口以及SplSubject和SplObjectStorage接口,利用這些接口,構建觀察者模式簡直易如反掌。“SPL”是標準PHP類庫(Standard PHP Library)的簡寫,這個庫中包括一組解決標準問題的接口和類。參考手冊
相關資料關于觀察者模式
利用 SPL 快速實現 Observer 設計模式
PHP SPL標準庫之數據結構對象容器(SplObjectStorage)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81231.html
摘要:概念觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并自動刷新。觀察者模式符合接口隔離原則,實現了對象之間的松散耦合。 概念 觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并自動刷新。 當一個對象狀態發生改變后,會影響到其他幾個對象的改變,這...
摘要:設計觀察者模式是為了讓一個對象跟蹤某個狀態,知道狀態何時改變,一旦狀態改變,所有訂閱對象都能得到通知。類與觀察者設計模式沒有內在的關系,不過通過它其內置的和方法可以很方便的將觀察者實例與一個主題實例相關聯以及解除關聯。 前言 知識就是作為觀察者所獲得的結論,經過科學培訓的觀察者會為我們提供所有能感知的現實。設計觀察者模式是為了讓一個對象跟蹤某個狀態,知道狀態何時改變,一旦狀態改變,所有...
摘要:設計觀察者模式是為了讓一個對象跟蹤某個狀態,知道狀態何時改變,一旦狀態改變,所有訂閱對象都能得到通知。類與觀察者設計模式沒有內在的關系,不過通過它其內置的和方法可以很方便的將觀察者實例與一個主題實例相關聯以及解除關聯。 前言 知識就是作為觀察者所獲得的結論,經過科學培訓的觀察者會為我們提供所有能感知的現實。設計觀察者模式是為了讓一個對象跟蹤某個狀態,知道狀態何時改變,一旦狀態改變,所有...
摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...
閱讀 2727·2021-11-22 15:22
閱讀 1631·2021-11-22 14:56
閱讀 3616·2021-09-22 15:12
閱讀 2403·2021-09-02 15:41
閱讀 2122·2021-08-27 16:26
閱讀 1113·2019-08-30 15:55
閱讀 2139·2019-08-29 17:30
閱讀 665·2019-08-29 16:26