您好,登錄后才能下訂單哦!
PHP設(shè)計(jì)模式-觀察者
一個(gè)對(duì)象狀態(tài)發(fā)生改變后,會(huì)影響到其他幾個(gè)對(duì)象的改變,這時(shí)候可以用觀察者模式。一個(gè)對(duì)象通過添加一個(gè)attach方法允許觀察者注冊(cè)自己,使本身變得可觀察。當(dāng)被觀察的對(duì)象更改時(shí),它會(huì)將消息發(fā)送到已注冊(cè)的觀察者。觀察者使用該信息執(zhí)行的操作與被觀察的對(duì)象無關(guān)。觀察者模式是一種事件系統(tǒng),意味著這一模式允許某些類通過觀察被觀察類的狀態(tài)變化,做出相應(yīng)的動(dòng)作。
觀察者模式UML圖
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{ } } } //實(shí)施觀察 $user= new user("sports"); $user->attach(new secrity()); $user->attach(new ad()); $user->login(); ?>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。