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中将网页导出为Word文档的代码
May 25 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
兼容ie6浏览器的php下载文件代码分享
Jul 14 PHP
php常用文件操作函数汇总
Nov 22 PHP
PHP过滤黑名单关键字的方法
Dec 01 PHP
php遍历树的常用方法汇总
Jun 18 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
PHP利用Socket获取网站的SSL证书与公钥
Jun 18 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
php桥接模式应用案例分析
Oct 23 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
PHP5/ZendEngine2的改进
2006/10/09 PHP
测试您的 PHP 水平的题目
2007/05/30 PHP
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
详解VUE 数组更新
2017/12/16 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
基于Python闭包及其作用域详解
2017/08/28 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
直接有效的自我评价
2014/01/11 职场文书
情况说明书格式范文
2014/05/06 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
八达岭长城导游词
2015/01/30 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
基石观后感
2015/06/12 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
MongoDB数据库之添删改查
2022/04/26 MongoDB
彻底卸载VMware虚拟机的超详细步骤记录
2022/07/15 Servers