PHP 观察者模式和php实现 Observer Pattern
观察者模式:
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式是一种对象行为型模式。
模式动机
建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。
观察者模式包含如下角色:
Subject: 目标
ConcreteSubject: 具体目标
Observer: 观察者
ConcreteObserver: 具体观察者
UML类图:

适用性:
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的
//代码实现

<?php
header("Content-type:text/html;Charset=utf-8");
//目标接口,定义观察目标要实现的方法
abstract class Subject{
abstract function attach(Observer $observer); //添加观察者
abstract function detach(Observer $observer); //去除观察者
abstract function notify(); //满足条件时通知所有观察者修改
abstract function condition($num); //发起通知的条件
}
//具体观察目标
class ConcreteSubject extends Subject{
private $observers = array();
//添加观察者
function attach(Observer $observer){
$this->observers[] = $observer;
}
//移除观察者
function detach(Observer $observer){
$key=array_search($observer, $this->observers);
if($key !== false){ //注意不要写成!=,表达式0!=flase为flase
unset($this->observers[$key]);
}
}
//通知所有所有观察者修改
function notify(){
foreach($this->observers as $observer){
$observer->update();
}
}
//发起通知的条件
function condition($num){
if($num>100){
$this->notify();
}
}
} //抽象观察者接口,定义所有观察者共同具有的属性——执行修改
abstract class Observer{
abstract function update();
}
//具体观察者类,实现抽象观察者接口
class ConcreteObserverA extends Observer{ function update(){
echo "A报告:敌军超过一百人了,快撤!<br>";
}
//其他函数
function eat(){
echo "A在吃饭";
}
}
class ConcreteObserverB extends Observer{ function update(){
echo "B报告:敌军超过一百人了,快撤!<br>";
}
//其他函数
function sleep(){
echo "B在睡觉";
}
} //测试
$observerA = new ConcreteObserverA();
$observerB = new ConcreteObserverB();
$concreteSubject = new ConcreteSubject();
$concreteSubject->attach($observerA); //添加观察者A
$concreteSubject->detach($observerA); //去除观察者A
$concreteSubject->attach($observerA);
$concreteSubject->attach($observerB);
$concreteSubject->condition(1000); ?>

PHP 观察者模式和php实现 Observer Pattern的更多相关文章
- 深入浅出设计模式——观察者模式(Observer Pattern)
模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...
- 设计模式 - 观察者模式(Observer Pattern) 详细说明
观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
- 设计模式(二)The Observer Pattern 观察者模式
问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新 ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 设计模式 - 观察者模式(Observer Pattern) 详细解释
观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
- C#设计模式之十七观察者模式(Observer Pattern)【行为型】
一.引言 今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份)把所有的模式写完,2018年,新的一年写一些新的东西.今天我们开始讲& ...
- C#设计模式之十六观察者模式(Observer Pattern)【行为型】
一.引言 今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份)把所有的模式写完,2018年,新的一年写一些新的东西.今天我们开始讲“行为 ...
- 设计模式のObserver Pattern(观察者模式)----行为模式
一.问题产生背景 又被称为订阅发布模式. 最初流传最广的一个面试题:有一只猫咪,猫咪叫了一声,老鼠跑了,老人惊醒了,男主人骂,小偷吓得不敢动了....这就产生一个问题的模型,当对象间存在一对多关系时, ...
- 2.Observer Pattern(观察者模式)
Observer Pattern(观察者模式)定义: 在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新. 干说定义肯定没有举例理解的透彻.想到Observ ...
随机推荐
- 点击一个div ,把div里的某个参数的值,传到一个input里面
- 运行结果出现Process finished with exit code 0
表示程序正常执行完毕并退出. 可以科普一下exit code,在大部分编程语言中都适用 exit code 0表示程序执行成功,正常退出 exit code 1表示执行过程中遇到了某些问题或者错误,非 ...
- [python]如何理解uiautomator里面的 instance 及使用场景
通过uiautomatorviewer打开之后,需要通过对某个控件进行操作,但在当前界面中该控件所有属性无法唯一(其它控件属性也是一样),这个时候就需要借助实例(instance)来进行区分,inst ...
- HTML5中的Canvas详解
什么是Canvas HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图形容器,您必须使用脚本来绘制图 ...
- python第三十一课--递归(1.简单递归函数的定义和使用)
演示:简单递归函数的定义和使用 需求:1~5进行累加 找寻关系:函数名:mySum(num) 1).找临界点:运算到1(加到1)就结束了 2). 第一次:5+mySum(5-1)-->retur ...
- 【转】使用程序修改系统(IE)代理设置
文章都是发布在github再转到这边的,这边格式可能会乱掉.博客地址:benqy.com 这是本人在做的一个前端开发调试工具(HttpMock),功能是web服务器+http日记+http代理(类似f ...
- linux(centos 7) 下安装nodejs
1,到node官网下载linux版本,有32和64位版本 2,将文件上传到linux下 3,使用tar -xvf node-v8.9.3-linux-x64.tar.xz 进行解压 4,建立软连接,变 ...
- linux 创建守护进程的相关知识
linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关 ...
- Swift - 给图片和按钮添加阴影边框
最近比较忙,想要做的事情有很多,能做出来的就只有一部份,我觉得也许是我没有计划和规律造成的,我需要坚持下去,今天写了一个swift2.0给按钮或者图片添加阴影的效果,就当做笔记吧:-) Swift C ...
- 复习整理2:juit
@FixMethodOrder(MethodSorters.NAME_ASCENDING)测试回环 https://blog.csdn.net/u014294166/article/details/5 ...