php模式設(shè)計(jì)之觀察者模式應(yīng)用實(shí)例分析
本文實(shí)例講述了php模式設(shè)計(jì)之觀察者模式。分享給大家供大家參考,具體如下:
這是我寫的《php模式設(shè)計(jì)》的第五篇。前面的四篇在不斷學(xué)習(xí)不斷加深認(rèn)識(shí),到了今天再看觀察者模式,覺(jué)得非常容易理解。這也許就是我們積少成多的結(jié)果吧。希望還是能夠不斷進(jìn)步。
開(kāi)篇還是從名字說(shuō)起,“觀察者模式”的觀察者三個(gè)字信息量很大。玩過(guò)很多網(wǎng)絡(luò)游戲的童鞋們應(yīng)該知道,即便是斗地主,除了玩家,還有一個(gè)角色叫“觀察者"。在我們今天他談?wù)摰哪J皆O(shè)計(jì)中,觀察者也是如此。首先,要有一個(gè)“主題”。只有有了一個(gè)主題,觀察者才能搬著小板凳兒聚在一堆。其次,觀察者還必須要有自己的操作。否則你聚在一堆兒沒(méi)事做也沒(méi)什么意義。
從面向過(guò)程的角度來(lái)看,首先是觀察者向主題注冊(cè),注冊(cè)完之后,主題再通知觀察者做出相應(yīng)的操作,整個(gè)事情就完了。
從面向?qū)ο蟮慕嵌葋?lái)看,主題提供注冊(cè)和通知的接口,觀察者提供自身操作的接口。(這些觀察者擁有一個(gè)同一個(gè)接口。)觀察者利用主題的接口向主題注冊(cè),而主題利用觀察者接口通知觀察者。耦合度相當(dāng)之低。
如何實(shí)現(xiàn)觀察者注冊(cè)?通過(guò)前面的注冊(cè)者模式很容易給我們提供思路,把這些對(duì)象加到一棵注冊(cè)樹(shù)上就好了嘛。如何通知?這就更簡(jiǎn)單了,對(duì)注冊(cè)樹(shù)進(jìn)行遍歷,讓每個(gè)對(duì)象實(shí)現(xiàn)其接口提供的操作。
<?php
// 主題接口
interface Subject{
public function register(Observer $observer);
public function notify();
}
// 觀察者接口
interface Observer{
public function watch();
}
// 主題
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();
}
}
}
// 觀察者
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/>";
}
}
// 應(yīng)用實(shí)例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();
運(yùn)行結(jié)果:
Cat watches TV
--------------------------------------------------------------------------------
People watches TV
--------------------------------------------------------------------------------
Dog watches TV
--------------------------------------------------------------------------------
所謂模式,更多的是一種想法,完全沒(méi)必要拘泥于代碼細(xì)節(jié)。觀察者模式更多體現(xiàn)了兩個(gè)獨(dú)立的類利用接口完成一件本應(yīng)該很復(fù)雜的事情。不利用主題類的話,我們還需要不斷循環(huán)創(chuàng)建實(shí)例,執(zhí)行操作。而現(xiàn)在只需要?jiǎng)?chuàng)建實(shí)例就好,執(zhí)行操作的事兒只需要調(diào)用一次通知的方法就好啦。
從開(kāi)始的單例模式我一步步考慮如何實(shí)現(xiàn)代碼,到現(xiàn)在大部分實(shí)現(xiàn)代碼一句帶過(guò),實(shí)際上是建立在前面不斷積累的基礎(chǔ)上。真心感覺(jué)通過(guò)不斷學(xué)習(xí)設(shè)計(jì)模式能很大加深對(duì)面向?qū)ο缶幊痰乃伎?。?dāng)然紙上談兵還是要不得的,最好還是投入更多的練習(xí)中去吧~~·
相關(guān)文章:《使用觀察者模式處理異常信息》
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
微信公眾平臺(tái)開(kāi)發(fā)教程⑥ 微信開(kāi)發(fā)集成類的使用圖文詳解
這篇文章主要介紹了微信公眾平臺(tái)開(kāi)發(fā)之微信開(kāi)發(fā)集成類的使用,結(jié)合圖文形式詳細(xì)分析了微信開(kāi)發(fā)集成類的原理、功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-04-04
PHP利用APC模塊實(shí)現(xiàn)大文件上傳進(jìn)度條的方法
這篇文章主要介紹了PHP利用APC模塊實(shí)現(xiàn)大文件上傳進(jìn)度條的方法,并分享了相關(guān)配置說(shuō)明,感興趣的朋友可以學(xué)習(xí)借鑒。2015-10-10
使用PHP實(shí)現(xiàn)抖音直播彈幕抓取的步驟詳解
抖音直播是當(dāng)今熱門的實(shí)時(shí)互動(dòng)平臺(tái)之一,用戶在直播間內(nèi)發(fā)送的彈幕消息是互動(dòng)的關(guān)鍵組成部分,在本文中,我們將介紹如何使用 PHP 技術(shù)實(shí)現(xiàn)抖音直播彈幕的抓取,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
WordPress中自定義后臺(tái)管理界面配色方案的小技巧
這篇文章主要介紹了WordPress中自定義后臺(tái)管理界面配色方案的小技巧,即使用wp_admin_css_color()函數(shù)來(lái)添加配色,需要的朋友可以參考下2015-12-12
php數(shù)字每三位加逗號(hào)的功能函數(shù)
這篇文章主要介紹了php數(shù)字每三位加逗號(hào)的功能函數(shù),想知道如何做到數(shù)字每三位加逗號(hào)的朋友可以參考下2015-10-10
PHP中使用CURL偽造來(lái)路抓取頁(yè)面或文件
這個(gè)是用 PHP 偽造來(lái)路, 抓取文件或頁(yè)面的代碼, 挺簡(jiǎn)單的.2011-05-05
PHP載入圖像imagecreatefrom_gif_jpeg_png系列函數(shù)用法分析
這篇文章主要介紹了PHP載入圖像imagecreatefrom_gif_jpeg_png系列函數(shù)用法,結(jié)合實(shí)例形式分析了php的圖像載入函數(shù)imagecreatefromgif、imagecreatefromjpeg、imagecreatefrompng、imagecreatefromwbmp及imagecreatefromstring使用技巧,需要的朋友可以參考下2016-11-11
深入理解PHP原理之Session Gc的一個(gè)小概率Notice
PHP Notice: session_start(): ps_files_cleanup_dir2011-04-04
深入理解PHP之?dāng)?shù)組(遍歷順序) Laruence原創(chuàng)
經(jīng)常會(huì)有人問(wèn)我, PHP的數(shù)組, 如果用foreach來(lái)訪問(wèn), 遍歷的順序是固定的么? 以什么順序遍歷呢?下面看Laruence整理的2012-06-06

