php设计模式 Observer(观察者模式)


Posted in PHP onJune 26, 2011
<?php 
/** 
* 观察者模式 
* 
* 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新 
* 能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能 
* 插件系统 
*/ 
class Observerable 
{ 
private $_observers = array(); public function registerObserver($observer) 
{ 
$this->_observers[] = $observer; 
} 
public function removeObserver($observer) 
{ 
$key = array_search($observer,$this->_observers); 
if(!($key === false)) 
{ 
unset($this->_observers[$key]); 
} 
} 
public function notifyObservers() 
{ 
foreach($this->_observers as $observer) 
{ 
if($observer instanceof Observer) $observer->update($this); 
} 
} 
} 
interface Observer 
{ 
public function update($observer); 
} 
interface DisplayElement 
{ 
public function display(); 
} 
// -- 实例类定义 
class NewsObserverable extends Observerable 
{ 
private $_sports_news; 
public function setSportsNews($data) 
{ 
$this->_sports_news = $data; 
$this->notifyObservers(); 
} 
public function getSportsNews() 
{ 
return $this->_sports_news; 
} 
private $_local_news; 
public function setLocalNews($data) 
{ 
$this->_local_news = $data; 
$this->notifyObservers(); 
} 
public function getLocalNews() 
{ 
return $this->_local_news; 
} 
} 
class SportsNews implements Observer,DisplayElement 
{ 
private $_data = null; 
public function update($observer) 
{ 
if($this->_data != $observer->getSportsNews()) 
{ 
$this->_data = $observer->getSportsNews(); 
$this->display(); 
} 
} 
public function display() 
{ 
echo $this->_data.date("Y-m-d H:i:s")."<br/>"; 
} 
} 
class LocalNews implements Observer,DisplayElement 
{ 
private $_data = null; 
public function update($observer) 
{ 
if($this->_data != $observer->getLocalNews()) 
{ 
$this->_data = $observer->getLocalNews(); 
$this->display(); 
} 
} 
public function display() 
{ 
echo $this->_data.date("Y-m-d H:i:s")."<br/>"; 
} 
} 
// -- 实例化 --- 
$objObserver = new NewsObserverable(); 
$local = new LocalNews(); 
$sports = new SportsNews(); 
$objObserver->registerObserver($local); 
$objObserver->registerObserver($sports); 
$objObserver->setSportsNews("sports news 1 "); 
$objObserver->setLocalNews("local news 1 "); 
$objObserver->removeObserver($sports); 
$objObserver->setLocalNews("local news 2 "); 
$objObserver->setSportsNews("sports news 2 "); 
$objObserver->removeObserver($local); 
$objObserver->setLocalNews("local news 3 ");
PHP 相关文章推荐
PHP+javascript液晶时钟
Oct 09 PHP
一些常用的php函数
Dec 06 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
PHP下使用CURL方式POST数据至API接口的代码
Feb 14 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
Mar 06 PHP
解析php5配置使用pdo
Jul 03 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
PHP利用Socket获取网站的SSL证书与公钥
Jun 18 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
php5与php7的区别点总结
Oct 11 PHP
php设计模式 Singleton(单例模式)
Jun 26 #PHP
php设计模式 Command(命令模式)
Jun 26 #PHP
php设计模式 Template (模板模式)
Jun 26 #PHP
php设计模式 Proxy (代理模式)
Jun 26 #PHP
php设计模式 Composite (组合模式)
Jun 26 #PHP
php设计模式 State (状态模式)
Jun 26 #PHP
php设计模式 Bridge (桥接模式)
Jun 26 #PHP
You might like
PHP自动生成月历代码
2006/10/09 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
js以对象为索引的关联数组
2010/07/04 Javascript
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
详解python中的线程
2018/02/10 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
仓库门卫岗位职责
2013/12/22 职场文书
餐饮业的创业计划书范文
2013/12/26 职场文书
开工仪式主持词
2014/03/20 职场文书
react antd实现动态增减表单
2021/06/03 Javascript
MySQL的Query Cache图文详解
2021/07/01 MySQL