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 相关文章推荐
APMServ使用说明
Oct 23 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
PHP函数getenv简介和使用实例
May 12 PHP
PHP远程采集图片详细教程
Jul 01 PHP
php实现简单文件下载的方法
Jan 30 PHP
thinkPHP2.1自定义标签库的导入方法详解
Jul 20 PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
PHP常用字符串函数小结(推荐)
Aug 05 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
Jun 12 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 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/04/08 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
php桥接模式应用案例分析
2019/10/23 PHP
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
vue项目中导入swiper插件的方法
2018/01/30 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
python自动安装pip
2014/04/24 Python
利用python获取Ping结果示例代码
2017/07/06 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
如何使用repr调试python程序
2020/02/28 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
python中操作文件的模块的方法总结
2021/02/04 Python
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
校本教研工作制度
2014/01/22 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
新员工辞职信范文
2015/05/12 职场文书
小英雄雨来观后感
2015/06/09 职场文书
大学学生会竞选稿
2015/11/19 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书
小组组名及励志口号
2015/12/24 职场文书
Mysql基础之常见函数
2021/04/22 MySQL
MySQL的Query Cache图文详解
2021/07/01 MySQL