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教程孙仲岳主讲
Jan 07 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
php数组查找函数总结
Nov 18 PHP
thinkphp模板用法和内容输出实例
Nov 28 PHP
PHP错误Warning:mysql_query()解决方法
Oct 24 PHP
学习php设计模式 php实现单例模式(singleton)
Dec 07 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
PHP二维关联数组的遍历方式(实例讲解)
Oct 18 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
Sep 30 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 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中die(),exit(),return的区别
2013/06/20 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
python实现基于SVM手写数字识别功能
2020/05/27 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
python同步两个文件夹下的内容
2019/08/29 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
shell程序中如何注释
2012/02/17 面试题
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
客服部班长工作责任制
2014/02/25 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
工地安全质量标语
2014/06/07 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
保护动物的宣传语
2015/07/13 职场文书
同学聚会致辞集锦
2015/07/28 职场文书