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 相关文章推荐
BBS(php &amp; mysql)完整版(三)
Oct 09 PHP
PHP读MYSQL中文乱码的解决方法
Dec 17 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 PHP
PHP根据IP判断地区名信息的示例代码
Mar 03 PHP
php实现的返回数据格式化类实例
Sep 22 PHP
php实现模拟登陆方正教务系统抓取课表
May 19 PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 PHP
PHP智能识别收货地址信息实例
Jan 05 PHP
PHP工厂模式的日常使用
Mar 20 PHP
PHP反射学习入门示例
Jun 14 PHP
php 利用socket发送GET,POST请求的实例代码
Jul 04 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 JSON格式数据交互实例代码详解
2011/01/13 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
python中List的sort方法指南
2014/09/01 Python
Django在win10下的安装并创建工程
2017/11/20 Python
python操作列表的函数使用代码详解
2017/12/28 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
pandas去除重复列的实现方法
2019/01/29 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
教师研修随笔感言
2014/01/23 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
督导岗位职责范本
2015/04/10 职场文书
公司转让协议书
2016/03/19 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang