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 相关文章推荐
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 PHP
php cc攻击代码与防范方法
Oct 18 PHP
PHP自定义大小验证码的方法详解
Jun 07 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
Jun 25 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
php中jpgraph类库的使用介绍
Aug 08 PHP
php引用传值实例详解学习
Nov 06 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 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实现的XXTEA加密解密算法示例
2018/08/28 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
对vue生命周期的深入理解
2020/12/03 Vue.js
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
Python help()函数用法详解
2014/03/11 Python
Python装饰器用法示例小结
2018/02/11 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
Python二维码生成识别实例详解
2019/07/16 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
台湾家适得:Homeget
2019/02/11 全球购物
餐饮总经理岗位职责
2014/03/07 职场文书
希特勒经典演讲稿
2014/05/19 职场文书
心得体会的写法
2014/09/05 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
学习心得体会
2019/06/20 职场文书
新手初学Java List 接口
2021/07/07 Java/Android
使用CSS连接数据库的方式
2022/02/28 HTML / CSS
golang生成并解析JSON
2022/04/14 Golang