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对象类型判断
Aug 27 PHP
Views rows style模板重写代码
May 16 PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 PHP
php输出xml格式字符串(用的这个)
Jul 12 PHP
php中addslashes函数与sql防注入
Nov 17 PHP
php实现字符串反转输出的方法
Mar 14 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
php getcwd与dirname(__FILE__)区别详解
Sep 24 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
PHP一个简单的无需刷新爬虫
Jan 05 PHP
laravel框架分组控制器和分组路由实现方法示例
Jan 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中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
不错的一个日期输入 动态
2006/11/06 Javascript
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
vue2.0 路由模式mode=&quot;history&quot;的作用
2018/10/18 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
Python中的zipfile模块使用详解
2015/06/25 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
Django model select的多种用法详解
2019/07/16 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
Java的基础面试题附答案
2016/01/10 面试题
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
党校学习思想汇报
2014/01/06 职场文书
商场端午节活动方案
2014/01/29 职场文书
2014年实习生工作总结
2014/11/27 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python