PHP設(shè)計(jì)模式之觀察者模式定義與用法示例
本文實(shí)例講述了PHP設(shè)計(jì)模式之觀察者模式定義與用法。分享給大家供大家參考,具體如下:
<?php /** * Interface Observable * define a observable interface * @author jichao.wang */ interface Observable { function attach(Observer $observer); function detach(Observer $observer); function notify(); } /** * Class Login * @author jichao.wang */ class Login implements Observable { private $observers; public $status; public $ip; const LOGIN_ACCESS = 1; const LOGIN_WRONG_PASS = 2; const LOGIN_USER_UNKNOWN = 3; function __construct() { $this->observers = array(); } /** * @param Observer $observer * @author jichao.wang * attach a observer */ function attach(Observer $observer) { $this->observers[] = $observer; } /** * @param Observer $observer * @author jichao.wang * detach a observer */ function detach(Observer $observer) { $newObservers = array(); foreach ($this->observers as $key => $obs) { if ($obs !== $observer) { $newObservers[] = $obs; } } $this->observers = $newObservers; } /** * @author jichao.wang * handle observer notify */ function notify() { foreach ($this->observers as $obs) { $obs->update($this); } } /** * @author jichao.wang * 執(zhí)行登陸 */ function handleLogin() { $ip = rand(1,100); switch (rand(1, 3)) { case 1: $this->setStatus(self::LOGIN_ACCESS, $ip); $ret = true; break; case 2: $this->setStatus(self::LOGIN_WRONG_PASS, $ip); $ret = false; break; case 3: $this->setStatus(self::LOGIN_USER_UNKNOWN, $ip); $ret = false; break; } /** * handle event */ $this->notify(); return $ret; } /** * @param $status * @author jichao.wang * set login status */ function setStatus($status,$ip) { $this->status = $status; $this->ip = $ip; } /** * @return mixed * @author jichao.wang * get login status */ function getStatus() { return $this->status; } } /** * Interface Observer * @author jichao.wang */ interface Observer { function update(Observable $observable); } /** * Class EmailObserver * @author jichao.wang */ class EmailObserver implements Observer { function update (Observable $observable) { $status = $observable->getStatus(); if($status == Login::LOGIN_ACCESS){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸成功!'); echo __CLASS__.'用戶ip:'.$observable->ip.'登陸成功!'.'------------------'; } if($status == Login::LOGIN_WRONG_PASS){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'); echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------'; } if($status == Login::LOGIN_USER_UNKNOWN){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'); echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'.'------------------'; } } } /** * Class PhoneObserver * @author jichao.wang */ class PhoneObserver implements Observer { function update (Observable $observable) { $status = $observable->getStatus(); if($status == Login::LOGIN_ACCESS){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸成功!'); echo __CLASS__.'用戶ip:'.$observable->ip.'登陸成功!'.'------------------'; } if($status == Login::LOGIN_WRONG_PASS){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'); echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------'; } if($status == Login::LOGIN_USER_UNKNOWN){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'); echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'.'------------------'; } } } class AbcObserver implements Observer { function update (Observable $observable) { $status = $observable->getStatus(); if($status == Login::LOGIN_ACCESS){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸成功!'); echo __CLASS__.'用戶ip:'.$observable->ip.'登陸成功!'.'------------------'; } if($status == Login::LOGIN_WRONG_PASS){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'); echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------'; } if($status == Login::LOGIN_USER_UNKNOWN){ // $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'); echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無此用戶!'.'------------------'; } } } //實(shí)例化登陸信息 $login = new Login(); //實(shí)現(xiàn)發(fā)郵件觀察者 $login->attach(new EmailObserver()); //實(shí)現(xiàn)發(fā)驗(yàn)證碼觀察者 $login->attach(new PhoneObserver()); //實(shí)現(xiàn)其他觀察者 $login->attach(new AbcObserver()); //開始登陸 $login->handleLogin(); ?>
運(yùn)行結(jié)果:
EmailObserver用戶ip:41登陸失敗,無此用戶!------------------PhoneObserver用戶ip:41登陸失敗,無此用戶!------------------AbcObserver用戶ip:41登陸失敗,無此用戶!------------------
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- PHP設(shè)計(jì)模式之觀察者模式(Observer)詳細(xì)介紹和代碼實(shí)例
- php設(shè)計(jì)模式 Observer(觀察者模式)
- PHP中常用的三種設(shè)計(jì)模式詳解【單例模式、工廠模式、觀察者模式】
- PHP設(shè)計(jì)模式之中介者模式(Mediator Pattern)入門與應(yīng)用案例詳解
- PHP設(shè)計(jì)模式之迭代器(Iterator)模式入門與應(yīng)用詳解
- PHP設(shè)計(jì)模式之解釋器(Interpreter)模式入門與應(yīng)用詳解
- PHP設(shè)計(jì)模式之工廠模式(Factory)入門與應(yīng)用詳解
- php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解
- php設(shè)計(jì)模式 Template (模板模式)
- php設(shè)計(jì)模式 Proxy (代理模式)
- PHP常用的三種設(shè)計(jì)模式匯總
- PHP設(shè)計(jì)模式之觀察者模式入門與應(yīng)用案例詳解
相關(guān)文章
PHP獲取一年中每個(gè)星期的開始和結(jié)束日期的方法
這篇文章主要介紹了PHP獲取一年中每個(gè)星期的開始和結(jié)束日期的方法,涉及php對(duì)日期操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02PHP常用設(shè)計(jì)模式之委托設(shè)計(jì)模式
委托是對(duì)一個(gè)類的功能進(jìn)行擴(kuò)展和復(fù)用的方法。它的做法是:寫一個(gè)附加的類提供附加的功能,并使用原來的類的實(shí)例提供原有的功能,接下來通過本文給大家介紹PHP委托設(shè)計(jì)模式實(shí)例詳解,感興趣的朋友一起學(xué)習(xí)吧2016-02-02PHP函數(shù)之error_reporting(E_ALL ^ E_NOTICE)詳細(xì)說明
在看帝國(guó)cms的connect.php是發(fā)現(xiàn)第一句是error_reporting(E_ALL ^ E_NOTICE);以前也沒注意過這個(gè)語句,知道是設(shè)置錯(cuò)誤提示的,但不清楚具體怎樣設(shè)置使用。下面從網(wǎng)上摘抄了些東西,總結(jié)了一下。2011-07-07sourcesafe管理phpproj文件的補(bǔ)充說明(downmoon)
在使用vs.php+ sourcesafe管理代碼時(shí),發(fā)現(xiàn)有時(shí)候并不能從vs.net IDE中正確獲取phpproj文件下的所有文件。但從sourcesafe IDE下卻可以。2009-04-04