PHP 觀察者模式深入理解與應(yīng)用分析
本文實例講述了PHP 觀察者模式。分享給大家供大家參考,具體如下:
用模式開發(fā)的優(yōu)點是,能讓我們的邏輯結(jié)構(gòu)以及代碼更加清晰,便于維護!
而我們?yōu)槭裁匆?“觀察者模式”?這就需要從實際運用中來理解才能更好的運用!用如下的情境來說明吧。
事例,開始時我被安排做項目的登錄,很快我就完成了。然后產(chǎn)品提出了另一個需求,用戶登錄后,給他們推送一條實時消息!然后我在登錄成功的邏輯后加了一段代碼,完成了登錄后的實時消息推送。然而事情還沒有完,產(chǎn)品又給加了個需求,需要給新登錄的用戶10塊錢紅包獎勵,這個當然很簡單,我又在消息推送后加了代碼,完成了新登錄用戶的紅包獎勵(錢怎么到賬的過程暫且不論),然而事情還沒完沒了了,產(chǎn)品不斷的在加需求了,如非vip用戶登錄,給他推送10條需要注冊VIP才能打開的信息,如根據(jù)客戶習慣推送10條客戶偏好的信息,如vip快到期的客戶需要在客戶登錄后提醒要充值啦。。。。。。。等等,如是這般,那我就得不停的在登錄后加代碼,變得我開始看不懂哪個xxx寫的代碼了!
那么此時我們就得考慮用‘觀察者模式'了
可以以這樣的方式簡單明了形容 觀察者模式, 某個商場門口安排一個人進行觀察,觀察到有a類型的顧客進門,立即安排敲鑼、打鼓、送鮮花,觀察到有b類客戶,立即安排購物袋,觀察到c類客戶,嗯嗯感覺他是來打醬油了,安排不要浪費表情了,什么歡迎儀式也沒有。。。。。也就是說 觀察者就是個‘勢利眼',看人下彩,根據(jù)觀察給進來的顧客安排對應(yīng)的某個服務(wù)或者某些服務(wù)!也許這個形容還不夠恰當,但大體意思差不多了。
接下來就是重點了,描述了觀察者模式的輪廓,那么就需要轉(zhuǎn)化為代碼來實際運用了!
一、首先得有兩個接口類,用以框定觀察者模式,
一個被觀察者接口類(一般申明有三個必須方法:1.添加觀察者對象的方法,2.刪除觀察者對象的方法 ,3.通知觀察者進行 相應(yīng)執(zhí)行的方法),
一個觀察者接口類(一般只有一個必須方法,就是執(zhí)行)
如果直接甩代碼可能有點難理解,那么就先給個示意圖來明確一下吧!
二、根據(jù)觀察者接口類的框定我們定下接口類如下代碼:
(示例是網(wǎng)上抄的,因為易于理解,申明一下出處,網(wǎng)址:http://www.dbjr.com.cn/article/170753.htm):
<?php // 被觀察者接口 interface Subject{ public function register(Observer $observer); //添加(注冊)觀察者對象 public function detach(Observer $observer); //刪除觀察者對象 public function notify(); //通知觀察者執(zhí)行相應(yīng)功能 } // 觀察者接口 interface Observer{ public function watch(); //觀察者要執(zhí)行的方法 }
三、根據(jù)框定的結(jié)構(gòu),大概的理解一下就是,要實現(xiàn) 被觀察者對象 存儲各種觀察者對象(完成各種功能的對象)存儲起來,然后通只各觀察者執(zhí)行自己的功能,先看看如下的實現(xiàn)代碼
<?php // 被觀察者繼承類 class Action implements Subject{ public $_observers=array(); //用于存儲觀察者對象 //用于添加(注冊)觀察者對象 public function register(Observer $observer){ $this->_observers[]=$observer; } //用于刪除觀察者對象 public function detach(Observer $observer){ $index = array_search($observer, $this->_observers); if ($index === FALSE || ! array_key_exists($index, $this->_observers)) { return FALSE; } unset($this->_observers[$index]); return TRUE; } //通知各觀察者 public function notify(){ //****重點,其實就是循環(huán)中執(zhí)行各觀察這對象的watch方法,不同功能方法內(nèi)容不同但方法名相同 foreach ($this->_observers as $observer) { $observer->watch(); } } } // cat觀察者繼承類 class Cat implements Observer{ public function watch(){ echo "Cat watches TV<hr/>"; } } //dog觀察者繼承類 class Dog implements Observer{ public function watch(){ echo "Dog watches TV<hr/>"; } } //people觀察者繼承類 class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } }
好了,我們現(xiàn)在通過上面的繼承就能明白了,觀察者就是定義各種功能的對象(這些對象就是:比如給第一次登錄的用戶發(fā)紅包,給用戶最新的10條文章推送,給非vip用戶推送10條需要注冊才能打開的視頻誘導用戶開通vip。。。。),被觀察者對象要實現(xiàn)的就是 將添加(注冊)的觀察者對象存儲起來并逐個通知執(zhí)行觀察者各自的功能,
四、那么就進行實例化對象進行操作了!代碼如下:
// 應(yīng)用實例 $action=new Action(); $action->register(new Cat()); $action->register(new People()); $action->register(new Dog()); $action->notify();
到這里我想如果應(yīng)該是有所理解了,如果我的理解有誤請?zhí)峤ㄗh,當然這只是觀察者模式的一個簡單過程,實際開發(fā)中會有所改動,當然大體脈絡(luò)就是這樣的!
還有一點個人的觀點是,如果我們需要搞清楚各種開發(fā)模式運用,那么就要從它能解決的需求理解,面向?qū)ο缶幊趟莵碓从谏?,?yīng)用于生活的,從這種模式解決的需求上進行理解,然后我們才能明白架構(gòu)定義出來的代碼(說得玄一點就是將 想法轉(zhuǎn)化為代碼來實現(xiàn),通過代碼 得到我們想要的結(jié)果) 。寫下這些其實也不為其他,只是想加深自己的印象,同時也希望對其他 同行的朋友有所助益!
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
相關(guān)文章
深入掌握include_once與require_once的區(qū)別
要深入掌握include(_once)與require(_once),需要掌握以下幾點內(nèi)容,不過有人建議不建議使用2013-06-06解析在zend Farmework下如何創(chuàng)立一個FORM表單
本篇文章是對在zend Farmework下如何創(chuàng)立一個FORM表單的方法進行了詳細的分析介紹,需要的朋友參考下2013-06-06php+ajax實現(xiàn)帶進度條的上傳圖片功能【附demo源碼下載】
這篇文章主要介紹了php+ajax實現(xiàn)帶進度條的上傳圖片功能,涉及php文件傳輸及ajax無刷新提交的相關(guān)操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-09-09PHP圖片處理之使用imagecopyresampled函數(shù)裁剪圖片例子
這篇文章主要介紹了PHP圖片處理之使用imagecopyresampled函數(shù)裁剪圖片例子,本文例子相對簡單,是一篇入門級的學習總結(jié),需要的朋友可以參考下2014-11-11php 刪除一個數(shù)組中的某個值.兼容多維數(shù)組!
php中刪除一個數(shù)組中的某個值.兼容多維數(shù)組,需要的朋友可以參考下2012-02-02php + ajax 實現(xiàn)的寫入數(shù)據(jù)庫操作簡單示例
這篇文章主要介紹了php + ajax 實現(xiàn)的寫入數(shù)據(jù)庫操作,結(jié)合實例形式分析了php + ajax 寫入數(shù)據(jù)庫基本原理、操作技巧與相關(guān)使用注意事項,需要的朋友可以參考下2020-05-05