<?php
/**
* 观察者模式
*//**
* 抽象主题角色
*/
interface Subject {/**
* 增加一个新的观察者对象
* @param Observer $observer
*/
public function attach(Observer $observer);/**
* 删除一个已注册过的观察者对象
* @param Observer $observer
*/
public function detach(Observer $observer);/**
* 通知所有注册过的观察者对象
*/
public function notifyObservers();
}/**
* 具体主题角色
*/
class ConcreteSubject implements Subject {private $_observers;public function __construct() {
$this->_observers = array();
}/**
* 增加一个新的观察者对象
* @param Observer $observer
*/
public function attach(Observer $observer) {
return array_push($this->_observers, $observer);
}/**
* 删除一个已注册过的观察者对象
* @param Observer $observer
*/
public function detach(Observer $observer) {
$index = array_search($observer, $this->_observers);
if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
return FALSE;
}unset($this->_observers[$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 implements Observer {/**
* 观察者的名称
* @var <type>
*/
private $_name;public function __construct($name) {
$this->_name = $name;
}/**
* 更新方法
*/
public function update() {
echo "Observer ". $this->_name. " has notified.\n";
}}$subject = new ConcreteSubject();/* 添加第一个观察者 */
$observer1 = new ConcreteObserver('Martin');
$subject->attach($observer1);echo "\n The First notify:\n";
$subject->notifyObservers();/* 添加第二个观察者 */
$observer2 = new ConcreteObserver('phppan');
$subject->attach($observer2);echo "\n The Second notify:\n";
$subject->notifyObservers();/* 删除第一个观察者 */
$subject->detach($observer1);echo "\n The Third notify:\n";
$subject->notifyObservers();
?>

转至:http://wend1054.blog.163.com/

转载于:https://www.cnblogs.com/feiyuhit/archive/2013/06/14/3135729.html

转 php 观察者模式相关推荐

  1. Java设计模式:观察者模式

    观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 如果这句话不好理解 可 ...

  2. 观察者模式的经典应用(猫叫 烧开水)

    Code 猫叫了 老鼠跑 主人惊醒  1/**//*  2 * 题目:  3 * 猫叫了,所有老鼠开始逃跑,主人被惊醒,请用OO的思想描绘此过程  4 * 1,老鼠跟主人是被动的  5 * 2,要考虑 ...

  3. Observer Pattern 观察者模式

    Observer Pattern (观察者模式) 定义: <设计模式>中对Observer模式的意图是这样描述的:"定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, ...

  4. 设计模式之观察者模式(Observer)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. java观察者模式_Java设计模式之观察者模式详解

    观察者模式,是一对多的关系,一个主题对应多个观察者,当这个主题发生变化的时候,所有观察着这个主题的观察者都会接收到通知来获悉主题的变化. 在现实中我们也会遇到许许多多应用观察者模式的行为,比如电视的节 ...

  6. python 设计模式 观察者_python设计模式之观察者模式

    说到观察者模式,在我脑海中总是闪现,这家伙跟消息队列的主题发布订阅有什么关系,虽然本人对消息队列没有很深的研究,但是凭直觉我就认为消息队列的实现就使用了观察者模式吧,所以本文就来模拟消息队列的丐版实现 ...

  7. JS设计模式-观察者模式

    观察者(又称发布订阅)模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 原文链接 应用场景 当用户在网页执行一些操作(如点击)后就需要执行 ...

  8. 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现

    1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者 按照上面的分析我们来进行设计 1.抽象主题Subject public interface Subject {publi ...

  9. 步步为营-44-窗体之间传值--观察者模式

    说明 :观察者模式又叫发布-订阅模式,其中又涉及到中介者模式 1 结构 2 创建Main窗体(中介者),ChildForm1(发布者),ChildForm2(订阅者),ChildForm3(订阅者), ...

  10. 观察者模式的Java实现及应用

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Turwe www.jianshu.com/p/1025f6 ...

最新文章

  1. SPU表管理之删除SPU表数据
  2. SetAutoResizeMode
  3. 博客作业05--查找
  4. (44)MessageBoxA 监视器(过写拷贝,不使用 shellcode 注入)
  5. 【学术相关】西湖大学教授:都说不唯论文,那我们发表论文是为了什么?
  6. 为什么进mysql需要用户和密码了_centos5安装 mysql 提示需要用户及密码进入?
  7. Linux本地yum源配置以及使用yum源安装gcc编译环境
  8. linux中第一个进程的形成,Linux进程管理
  9. oracle mysql 线程数_oracle线程数更改
  10. 比特币矿商比特微正筹备美股上市
  11. iis php5.3 mysql_IIS7.5+PHP5.3+MYSQL5.5
  12. 【机器学习原理】KNN分类算法
  13. 计算机专业 外文数据库,计算机专业外文翻译+原文-数据库管理系统介绍
  14. mysql sock_mysql.sock 文件解析
  15. 电脑热点突然不能用了,想想你是否新装了VMware等软件
  16. 第七周博客作业西北师范大学|李晓婷
  17. java用接口求立方体表面积_Java练习 SDUT-3337_计算长方体、四棱锥的表面积和体积...
  18. 存算分离后,VxRail动态计算节点构建虚拟化更给力
  19. 思维导图软件 XMind 8 和 XMind 2020的选择
  20. html基础之块元素、行内元素、行内块元素

热门文章

  1. Java异常处理001:Maven clean package时Failed to clean project: Failed to delete
  2. iOS AutoLayout使用技巧
  3. 《塑造互联网思维的企业》一一第4章 全球商务向社会化媒体的转变
  4. Linux日志文件总管——logrotate
  5. 无需写try/catch,也能正常处理异常
  6. 搭建Spring MVC 4开发环境八步走
  7. 使用iBATIS3.0完成增删改查
  8. 周鸿祎:在360新员工入职培训上的讲话
  9. hdu 1161 Eddy's mistakes
  10. 【转】[教程] CSS入门3:如何插入CSS样式