標籤:觀察者
PHP設計模式-觀察者
一個對象狀態發生改變後,會影響到其他幾個對象的改變,這時候可以用觀察者模式。一個對象通過添加一個attach方法允許觀察者註冊自己,使本身變得可觀察。當被觀察的對象更改時,它會將訊息發送到登入的觀察者。觀察者使用該資訊執行的操作與被觀察的對象無關。觀察者模式是一種事件系統,意味著這一模式允許某些類通過觀察被觀察類的狀態變化,做出相應的動作。
觀察者模式UML圖
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/84/18/wKiom1eFqYTib7dYAABp7cyUPIY415.jpg" title="1344171151_1446.jpg" alt="wKiom1eFqYTib7dYAABp7cyUPIY415.jpg" />
php5中提供了觀察者observer與被觀察者subject介面
interface SplSubject
{
function attach(SplObserver $observer);
function detach(SplObserver $observer);
function notify();
}
interface SqlObserver
{
function update(SplSubject $subject);
}
例子如下:
<?php class user implements SplSubject{ public $lognum; public $hobby; protected $observers; public function __construct($hobby){ $this->lognum= rand(1,10); $this->hobby= $hobby; $this->observers=new SplObjectStorage(); } public function login(){ $this->notify(); } public function attach(SPLObserver $observer){ $this->observers->attach($observer); } public function detach(SPLObserver $observer){ $this->observers->detach($observer); } public function notify(){ $this->observers->rewind(); while($this->observers->valid){ $observer= $this->observers->current(); $observer->update($this); $this->observers->next(); } } } class secrity implements SPLObserver{ public function update(SplSubject $subject){ if($subject->lognum>=3){ }else{ } } } class ad implements SPLObserver{ public function update(SplSubject $subject){ if($subject->hobby=="sports"){ }else{ } } } //實施觀察 $user= new user("sports"); $user->attach(new secrity()); $user->attach(new ad()); $user->login(); ?>
本文出自 “殘夢” 部落格,謝絕轉載!
PHP設計模式-觀察者