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脚本的10个技巧(4)
Oct 09 PHP
我的论坛源代码(五)
Oct 09 PHP
php htmlentities和htmlspecialchars 的区别
Aug 18 PHP
在PHP中PDO解决中文乱码问题的一些补充
Sep 06 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
PHP中实现crontab代码分享
Mar 26 PHP
php结合ajax实现手机发红包的案例
Oct 13 PHP
PHP获取ttf格式文件字体名的方法示例
Mar 06 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
PHPstorm激活码2020年5月13日亲测有效
Sep 17 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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
简单的php新闻发布系统教程
2014/05/09 PHP
php简单中奖算法(实例)
2017/08/15 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
js中的数组对象排序分析
2018/12/11 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
在Python的Django框架中加载模版的方法
2015/07/16 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
python实现贪吃蛇游戏
2020/03/21 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
深入理解Python 多线程
2020/06/16 Python
Python爬取微信小程序通用方法代码实例详解
2020/09/29 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
python自动化发送邮件实例讲解
2021/01/04 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
2021/02/24 Python
大学生创业计划书的范文
2014/01/07 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
早读课迟到检讨书
2014/09/25 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL