知識就是作為觀察者所獲得的結論,經過科學培訓的觀察者會為我們提供所有能感知的現實。設計觀察者模式是為了讓乙個物件跟蹤某個狀態,知道狀態何時改變,一旦狀態改變,所有訂閱物件都能得到通知。如果需要保證乙個狀態的一致性(比如說:狀態觸發類的應用),但是這個給定狀態可能有多個不同的使用者等級,這種情況下觀察者模式就很適用,而且很有幫助,各司其職。利用觀察者模式可以維護一致性,同時記錄建立乙個給定的狀態的物件個數。
觀察者模式很直觀。何必讓多個物件建立或跟蹤乙個給定的狀態呢?如果由乙個物件完成這個工作,然後通知其他可能用到這個狀態的物件,這樣會合理得多。
1、可用於觀察者設計模式的3個spl介面/類如下:
● splsubject
● splobserver
● splobjectstorage
1.1、splsubject
<?php
namespace common\observer;
use yii;
/** * splsubject.
* */
inte***ce splsubject
注意這個splsubject 介面指定attach()和detach()方法引數中$observer的資料型別必須是乙個splobserver 物件。
1.2、splobserver
splobserver 介面只有乙個update()方法,如下所示:
<?php
namespace common\observer;
use yii;
/** * splobserver
* */
inte***ce splobserver
update()方法對於觀察者模式至關重要,因為它會得到subject狀態的最新變化,並交給觀察者例項。
1.3、splobjectstorage
splobjectstorage 類與觀察者設計模式沒有內在的關係,不過通過它其內建的attach()和detach()方法可以很方便的將觀察者例項與乙個主題例項相關聯以及解除關聯。
<?php
namespace common\observer;
use yii;
/** * splobjectstorage 儲存物件的類
* * @property string $storage 儲存物件
* */
class splobjectstorage
//刪除方法
public function detach(splobserver $observer)}}
注釋:如果直接用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()方法,可以提供更輕鬆的耦合,並允許有多組觀察者。
<?php
namespace common\observer;
use yii;
//concretesubject
class concretesubject implements splsubject
//新增觀察者
public function attach(splobserver $observer)
//剔除觀察者
public function detach(splobserver $observer)
//通知notify
public function notify()
}//設定方法
public function setdata($datanow)
//獲取方法
public function getdata()
}?>
1.5、spl具體觀察者
用於實現更新函式來更新關聯的觀察者例項。
<?php
namespace common\observer;
use yii;
//concreteobserver
class concreteobserver implements splobserver }
?>
(附加的普通使用者具體觀察者)
<?php
namespace common\observer;
use yii;
//userbservers
class userobserver implements splobserver }
?>
1.6、spl客戶
「spl」client 類只是乙個標準客戶。這個客戶按照spl介面向具體主題和觀察者發出多個請求,不過自己並沒有實現spl類和介面。
<?php
namespace common\observer;
use yii;
//client
class client }
?>
1.7、client的呼叫輸出如下:
呼叫:$worker=new commonobserverclient();
輸出:
這裡splobjectstorage類是我自己寫的,貼出來分享一下。php5.1.0以及更高的版本有很多特性,其中之一就是提供了一組可以用於觀察者的設計模式的介面。可以研究一下怎麼使用,splobserver介面以及splsubject和splobjectstorage介面,利用這些介面,構建觀察者模式簡直易如反掌。「spl」是標準php類庫(standard php library)的簡寫,這個庫中包括一組解決標準問題的介面和類。參考手冊
關於觀察者模式
利用 spl 快速實現 observer 設計模式
php spl標準庫之資料結構物件容器(splobjectstorage)
php設計模式 觀察者模式
簡言之 觀察者模式 observer 當乙個物件狀態發生改變時,依賴它的物件全部會收到通知,並自動更新。具體描述 乙個物件通過新增乙個方法 該方法允許另乙個物件 觀察者,註冊自己 使本身變得可觀察。當可觀察的物件更改時,它會將訊息傳送到已註冊的觀察者。這些觀察者使用該資訊執行的操作與可觀察的物件無關...
PHP 設計模式 觀察者模式
觀察者模式 乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。1 定義乙個專案subjects抽象類 乙個觀察者observers抽象類。subject 實現三個方法,1,新增add 刪除 remove 通知 notify。observe 實現update 方法 格式和組合模式有點...
php設計模式 觀察者模式
在web應用中,通常,一些小範圍的資料和業務的改變,其他相關的業務資料也需要發生改變,這種情況,觀察者模式很適合。觀察者模式,通常是通過使用乙個叫observer的介面實現的,如果其他的類要引入觀察者,就要實現這個介面 比如,有乙個這樣的需求,如果產品匯率改變了,所有產品的相關頁面展示資訊和 計算也...