在php5.0.1版本中提供了SplSubject和SplObserver兩個介面幫助開發這實現觀察者模式。 被觀察者: 觀察者: 觀察者模式的簡單理解: 在官網API中提供了一個例子是這樣的。現在有幾種報紙,諸如美國日報、中國日報之類的,每類報紙都有固定的訂閱者。現在有個需求是:每當報紙發佈新的新 ...
在php5.0.1版本中提供了SplSubject和SplObserver兩個介面幫助開發這實現觀察者模式。
被觀察者:
SplSubject { /* 方法 */ abstract public void attach ( SplObserver $observer ) abstract public void detach ( SplObserver $observer ) abstract public void notify ( void ) }
觀察者:
SplObserver { /* 方法 */ abstract public void update ( SplSubject $subject ) }
觀察者模式的簡單理解:
在官網API中提供了一個例子是這樣的。現在有幾種報紙,諸如美國日報、中國日報之類的,每類報紙都有固定的訂閱者。現在有個需求是:每當報紙發佈新的新聞的時候,其相對應的訂閱者都可以收到該新聞的內容。
這樣的例子在日常開發中很常見,諸如我們訂閱了一些科技雜誌或者桃色新聞,然後,在我們的註冊郵箱中,邊會是不是的收到一些郵件。於是我們可以這樣簡單的理解。
新聞雜誌是被觀察者,我們作為觀察者,新聞雜誌有個發佈新聞的小視窗,每當這個視窗有迅猛的爆料時,我們立馬虎視眈眈的發現了。於是,我們書寫代碼:
<?php /** * 定義被觀察者:新聞雜誌 */ class Newspaper implements SplSubject{ private $name; private $observers = array(); private $content; public function __construct($name){ $this->name = $name; } public function attach (SplObserver $observer ){ $this->observers[] = $observer; } public function detach (SplObserver $observer ){ $key = array_search($observer, $observers); if($key){ unset($this->observers[$key]); } } public function notify( ){ foreach ($this->observers as $value) { $value->update($this); } } public function getContent(){ return $this->content; } public function breadOut($content){ $this->content = $content; $this->notify(); } } /** * 定義觀察者:訂閱用戶 */ class Reader implements SplObserver{ private $name; public function __construct($name){ $this->name = $name; } public function update(SplSubject $subject) { echo $this->name.' is reading breakout news <b>'.$subject->getContent().'</b><br>'; } } /** * 實例化新聞雜誌 * @var Newspaper */ $USANews = new Newspaper('USA NEWS'); $CHINANews = new Newspaper('CHINA NEWS'); /** * 實例化讀者 * @var Reader */ $jack = new Reader('jack'); $tom = new Reader('tom'); /** * 訂閱用戶在這一刻訂閱了該報紙 */ $USANews->attach($jack); $USANews->attach($tom); $sange = new Reader('zhangsan'); $siye = new Reader('lisi'); $CHINANews->attach($sange); $CHINANews->attach($siye); /** * 新聞雜誌小視窗打開,開始爆料 */ $USANews->breadOut('USA break out'); $CHINANews->breadOut('CHINA break out');
運行結果如下:
jack is reading breakout news USA break out tom is reading breakout news USA break out zhangsan is reading breakout news CHINA break out lisi is reading breakout news CHINA break out
每類報紙相對應的訂閱者都收到了該類報紙的爆料。