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 strtr() 函数使用说明
Nov 21 PHP
PHP nl2br函数 将换行字符转成 &amp;lt;br&amp;gt;
Aug 21 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
PHP中读写文件实现代码
Oct 20 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
May 17 PHP
thinkphp自带验证码全面解析
Sep 18 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
PHP实现权限管理功能示例
Sep 22 PHP
PHP实现用户登录的案例代码
May 10 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 常用类汇总 推荐收藏
2010/05/13 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
JavaScript程序中实现继承特性的方式总结
2016/06/24 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
小学教师学期末自我评价
2013/09/25 职场文书
党员服务承诺书
2014/05/28 职场文书
高一军训的心得体会
2014/09/01 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
营业用房租赁协议书
2014/11/26 职场文书
矛盾论读书笔记
2015/06/29 职场文书
会议主持词结束语
2015/07/03 职场文书
大学入学感言
2015/08/01 职场文书
2016年记者节感言
2015/12/08 职场文书
Python编写nmap扫描工具
2021/07/21 Python
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android
服务器间如何实现文件共享
2022/05/20 Servers