php设计模式之观察者模式的应用详解


Posted in PHP onMay 21, 2013

观察者模式:定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
观察者类:
1.抽象主题角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以任意多个观察者。抽象主题提供了增加和删除观察者对象的接口。
2.抽象观察者角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己
3.具体主题角色:存储相关状态到具体观察者对象,当具体主题的内部状态发生改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
4.具体观察者角色:存储一个具体主题对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致
作用:
1. 观察者模式的耦合度较小
2.支持广播通信

<?php
//抽象主题
interface Subject{
     public function attach($observer);
     public function detach($observer);
     public function notifyObservers();
}
//具体主题
class ConcreateSubject implements Subject{
     private $_observers;
     public function __construct(){
          $this->_observers = array();
     }     public function attach($observer){
          return array_push($this->_observers,$observer);
     }
     public function detach($observer){
          $index = array_search($observer,$this->_observers);
          if($index === false || !array_key_exists($index,$this->_observers)){
               return false;
          }
          unset($this->_observer[$index]);
          return true;
     }
     public function notifyObservers(){
          if(!is_array($this->_observers)){
               return false;
          }
          foreach($this->_observers as $observer){
               $observer->update();
          }
          return true;
     }
}
//抽象观察者
interface Observer{
     public function update();
}
//具体观察者
class ConcreteObserver implement Observer{
     private $_name;
     public function __construct($name){
          $this->_name = $name;
     }
     public function update(){
          echo 'Observer',$this->_name.'has notified<br/>';
     }
}
//客户端
class Client{
     public static function main(){
            $subject = new ConcreteSubject();
            //新增第一个观察者
            $observer1 = new ConcreteObserver('Martin');
            $subject->attach($observer1);
            //通知
            $subject->notifyObservers();
            //新增第二个观察者
            $observer2 = new ConcreteObserver('jaky');
            $subject->attach($observer2);
            //通知
            $subject->notifyObservers();
            //删除观察者1
            $subject->deatch($observer1);
            //通知
            $subject->notifyObservers();
     }
}
Client::main();
?>
PHP 相关文章推荐
如何对PHP程序中的常见漏洞进行攻击(上)
Oct 09 PHP
php 获取完整url地址
Dec 20 PHP
zend api扩展的php对象的autoload工具
Apr 18 PHP
PHP多个版本的分析解释
Jul 21 PHP
smarty基础之拼接字符串的详解
Jun 18 PHP
php的ajax简单实例
Feb 27 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
php获取url参数方法总结
Nov 13 PHP
php gd等比例缩放压缩图片函数
Jun 12 PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 PHP
php设计模式之命令模式的应用详解
May 21 #PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 #PHP
PHP无法访问远程mysql的问题分析及解决
May 16 #PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 #PHP
解析dedecms空间迁移步骤详解
May 15 #PHP
基于php缓存的详解
May 15 #PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 #PHP
You might like
php内嵌函数用法实例
2015/03/20 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
两种php实现图片上传的方法
2016/01/22 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
php探针不显示内存解决方法
2019/09/17 PHP
用于table内容排序
2006/07/21 Javascript
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
使用Python的Scrapy框架十分钟爬取美女图
2016/12/26 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python读取几个G的csv文件方法
2019/01/07 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
苹果香港官方商城:Apple香港
2016/09/14 全球购物
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
一套VC试题
2015/01/23 面试题
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
班组安全员工作职责
2014/02/01 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android
联想win10摄像头打不开怎么办?win10笔记本摄像头打不开解决办法
2022/04/08 数码科技