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 相关文章推荐
杏林同学录(八)
Oct 09 PHP
php设计模式 Proxy (代理模式)
Jun 26 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
destoon二次开发入门示例
Jun 20 PHP
php实现通过ftp上传文件
Jun 19 PHP
crontab无法执行php的解决方法
Jan 25 PHP
Yii框架弹出框功能示例
Jan 07 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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获得用户ip地址的比较不错的方法
2014/02/08 PHP
php删除指定目录的方法
2015/04/03 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
自动最大化窗口的Javascript代码
2013/05/22 Javascript
web网页按比例显示图片实现原理及js代码
2013/08/09 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
Python判断直线和矩形是否相交的方法
2015/07/14 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
python的变量与赋值详细分析
2017/11/08 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
教育科学研究生自荐信
2013/10/09 职场文书
年会活动策划方案
2014/01/23 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
质量提升方案
2014/06/16 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
骨干教师个人总结
2015/02/11 职场文书
博士生专家推荐信
2015/03/25 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
城南旧事电影观后感
2015/06/16 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书