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 无限极分类
Mar 27 PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
PHP 代码规范小结
Mar 08 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
thinkphp循环结构用法实例
Nov 24 PHP
PHP发送短信代码分享
Aug 11 PHP
php编程中echo用逗号和用点号连接的区别
Mar 26 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
Dec 29 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 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入门教程之上传文件实例详解
2016/09/11 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
Django框架自定义session处理操作示例
2019/05/27 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
django列表筛选功能的实现代码
2020/03/27 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
促销活动总结范文
2014/04/30 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
单位租车协议书
2015/01/29 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
MySQL GRANT用户授权的实现
2021/06/18 MySQL
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js