亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

解析PHP觀察者模式Observer

瀏覽:3日期:2022-09-07 13:10:12
目錄觀察者模式結(jié)構(gòu)圖概念代碼示例觀察者模式結(jié)構(gòu)圖

解析PHP觀察者模式Observer

概念

一個(gè)'演員'(被觀察者),一群'觀眾'(觀察者),一臺(tái)'攝影機(jī)'(記錄容器)

【觀察者模式中主要角色】

1.抽象主題(Subject)角色:主題角色將所有對(duì)觀察者對(duì)象的引用保存在一個(gè)集合中,每個(gè)主題可以有任意多個(gè)觀察者。 抽象主題提供了增加和刪除觀察者對(duì)象的接口。

2.抽象觀察者(Observer)角色:為所有的具體觀察者定義一個(gè)接口,在觀察的主題發(fā)生改變時(shí)更新自己。

3.具體主題(ConcreteSubject)角色:存儲(chǔ)相關(guān)狀態(tài)到具體觀察者對(duì)象,當(dāng)具體主題的內(nèi)部狀態(tài)改變時(shí),給所有登記過(guò)的觀察者發(fā)出通知。具體主題角色通常用一個(gè)具體子類實(shí)現(xiàn)。

4.具體觀察者(ConcretedObserver)角色:存儲(chǔ)一個(gè)具體主題對(duì)象,存儲(chǔ)相關(guān)狀態(tài),實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以使得其自身狀態(tài)和主題的狀態(tài)保持一致。

【使用場(chǎng)景】

假設(shè)項(xiàng)目經(jīng)理讓我們寫了一個(gè)登陸接口,咔咔擦擦寫完了

第二天讓我們加入統(tǒng)計(jì)登陸次數(shù),然后在后面加代碼第三天讓我們判斷登陸地區(qū),又在后面加代碼第四天讓我們?cè)谟脩舻顷懞笸扑突顒?dòng),再再后面加代碼第N天,這個(gè)接口已經(jīng)雜亂到?jīng)]人想維護(hù)了

我們需要讓項(xiàng)目保持高內(nèi)聚低耦合,就可以用到觀察者模式(非必須,看需求)

【觀察者模式與其它模式】

1.【中介者模式】(Mediator):通過(guò)封裝復(fù)雜的更新語(yǔ)義,ChangeManager充當(dāng)目標(biāo)和觀察者之間的中介者。2.【單例模式】(singleton模式):ChangeManager可使用Singleton模式來(lái)保證它是唯一的并且是可全局訪問(wèn)的。

代碼示例

接口示例

// 主題接口interface Subject{ public function register(Observer $observer); public function notify();}// 觀察者接口interface Observer{ public function watch();}

Subject就是被觀察者,Observer就是觀眾,也就是觀察者

被觀察者

// 被觀察者class Action implements Subject{ public $_observers=array(); public function register(Observer $observer){ $this->_observers[]=$observer; } public function notify(){ foreach ($this->_observers as $observer) { $observer->watch(); } } }

Action實(shí)現(xiàn)了被觀察者接口,他現(xiàn)在就是被觀察者,再定義一個(gè)$_observers數(shù)組,他就是記錄觀眾的容器了。

首先實(shí)現(xiàn)register方法,用它傳入一個(gè)觀察者,然后塞到數(shù)組里,再實(shí)現(xiàn)notify()方法,它會(huì)遍歷容器數(shù)組,執(zhí)行每個(gè)觀察者的watch()方法。

觀察者

// 觀察者class Cat implements Observer{ public function watch(){ echo 'Cat watches TV<hr/>'; } } class Dog implements Observer{ public function watch(){ echo 'Dog watches TV<hr/>'; } } class People implements Observer{ public function watch(){ echo 'People watches TV<hr/>'; } }

這里定義了三個(gè)觀察者,全都實(shí)現(xiàn)了Observer接口,前面的Subject會(huì)循環(huán)調(diào)用每個(gè)觀察者的watch()方法,所以我們需要實(shí)現(xiàn)每個(gè)觀察者的watch()方法。

調(diào)用

// 應(yīng)用實(shí)例$action=new Action();$action->register(new Cat());$action->register(new People());$action->register(new Dog());$action->notify();

首先new被觀察者對(duì)象,執(zhí)行它的register()方法,把每個(gè)觀察者都放入容器數(shù)組,最后執(zhí)行notify()方法,通知所有觀察者執(zhí)行自己的方法。

PHP原生自帶的觀察者模式

PHP有自帶的觀察者模式

splsubject接口 - 被觀察者 Observer接口 - 觀察者 SplObjectStorage對(duì)象 - 容器

首先我們有一個(gè)用戶登錄類

class user{ public function login() { echo ’登錄完畢’ }

讓他實(shí)現(xiàn)splsubject接口成為被觀察者。

首先在構(gòu)造函數(shù)里,讓他new SplObjectStorag()對(duì)象并賦值到屬性上方便后面調(diào)用 實(shí)現(xiàn)attach()方法,用來(lái)注冊(cè)觀察者 實(shí)現(xiàn)detach()方法,用來(lái)刪除觀察者 實(shí)現(xiàn)notify()方法,用來(lái)遍歷容器,調(diào)用每個(gè)觀察者的update方法(必須是update) rewind方法是容器指針重置到最開始,valid方法檢測(cè)容器是否遍歷完成并返回布爾,current方法是獲取當(dāng)前的觀察者,next方法是將指針后移一位 修改login()方法,在里面調(diào)用notify()來(lái)通知觀察者事件完成了

class user implements splsubject{ protected $observer = null; public function __construct() {$this->observer = new SplObjectStorage(); } public function login() {$this->notify();echo ’登錄完畢’; } public function attach(SplObserver $observer) {$this->observer->attach($observer); } public function detach(SplObserver $observer) {$this->observer->detach($observer); } public function notify() {$this->observer->rewind();while ($this->observer->valid()){ $observer = $this->observer->current(); $observer->update($this); $this->observer->next();} }}

觀察者

每個(gè)觀察者實(shí)現(xiàn)SplObserver接口,并實(shí)現(xiàn)update()方法

class cat implements SplObserver { public function update(SplSubject $subject) {echo ’小貓叫一下’; }}class dog implements SplObserver { public function update(SplSubject $subject) {echo ’小狗吼一聲’; }}

應(yīng)用

// 實(shí)時(shí)觀察$user = new user();$user->attach(new cat());$user->attach(new dog());$user->login();

以上就是解析PHP觀察者模式(Observer)的詳細(xì)內(nèi)容,更多關(guān)于PHP觀察者模式(Observer)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 最新国产三级久久 | 特级片在线观看 | 国产精品1区2区3区 国产精品1区2区3区在线播放 | 中中文字幕亚州无线码 | 国产一区二区三区在线观看免费 | 国产疯狂露脸对白 | 国产在线精品福利91香蕉 | 成人在线网址 | 日本一级在线播放线观看视频 | 国产1024一区二区你懂的 | 国产v欧美v日韩在线观看 | 国内视频自拍在线视频 | 可以免费观看欧美一级毛片 | 夜色成人免费观看 | 日韩a级大片| 国产欧美自拍 | 午夜aaaa| 国产黄网在线 | 久青草国产观看在线视频 | 日本五级黄色片 | 免费久| 精彩视频一区二区 | 久久国产影视免费精品 | 午夜激情视频在线播放 | 精品国产三级在线观看 | 伊人手机在线视频 | 精品国产免费久久久久久 | 久久亚洲国产欧洲精品一 | 黄色片在线播放 | 国产99视频精品免视看7 | 麻豆国产精品va在线观看不卡 | 亚洲国产日韩在线观看 | 黄色一级毛片免费看 | 特黄特色大片免费视频播放 | 久久免费精彩视频 | 中文字幕在线久热精品 | 国产黄色影院 | 成人中文字幕在线观看 | 国产黄大片在线观看视频 | 99re66热这里只有精品首页 | 免费观看日本高清a毛片 |