PHP 设计模式 笔记与总结(11)观察者模式
【观察者模式(Observer)】当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新
【场景】一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主题的代码
【观察者模式实现了低耦合,非侵入式的通知与更新机制】
【实例】
① 传统方式:
index.php
<?php
class Event{
function trigger(){
echo 'Event happened<br />';
//相关的更新操作,传统的方式是在事件代码之后,高耦合,侵入式
echo '逻辑1更新操作<br />';
echo '逻辑2更新操作<br />';
}
}
$event = new Event();
$event->trigger();
② 观察者模式
\Common 下新建 EventGenerator.php
<?php
namespace Common; //定义一个抽象类
abstract class EventGenerator{
private $observer = array();
function addObserver(Observer $observer){
$this->observer[] = $observer;
}
//通知
function notify(){
foreach($this->observer as $observer){
$observer->update();
}
}
}
\Common 下新建 Observer.php
<?php
namespace Common; //接口
interface Observer{
function update($event_info = null);
}
入口文件 index.php
<?php
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');
echo '<meta http-equiv="content-type" content="text/html;charset=utf8">'; class Event extends \Common\EventGenerator{
function trigger(){
echo 'Event happened<br />';
$this->notify();
}
} //编写观察者
//观察者1
class Observer1 implements Common\Observer{
function update($server_info = null){
echo "逻辑1更新操作<br />\n";
}
}
//观察者2
class Observer2 implements Common\Observer{
function update($server_info = null){
echo "逻辑2更新操作<br />\n";
}
} $event = new Event();
$event->addObserver(new Observer1);
$event->addObserver(new Observer2);
$event->trigger();
输出:
Event happened
逻辑1更新操作
逻辑2更新操作
当事件发生之后,两个 Observer 的 update 会自动更新,都会被触发。
没有在事件主体中编写任何的耦合的逻辑1 或者 逻辑2。
而且可以动态的关闭某一观察者的逻辑(例如注释 $event->addObserver(new Observer1);)
【附】
echo "逻辑1更新操作<br />\n";
双引号时 \n 不会显示在输出结果中,页面换行通过<br />,查看源码换行通过 \n
如果换成单引号,则在页面中也会把 \ 和 n 显示出来,而且查看源码也不会换行。
所以要使用双引号把 \n 包起来。
PHP 设计模式 笔记与总结(11)观察者模式的更多相关文章
- Javascript设计模式笔记
Javascript是越来越厉害了,一统前后端开发.于是最近把设计模式又看了一遍,顺便做了个笔记,以方便自己和他人共同学习. 笔记连载详见:http://www.meteorcn.net/wordpr ...
- .NET设计模式(19):观察者模式(Observer Pattern)(转)
概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御 ...
- php设计模式笔记:单例模式
php设计模式笔记:单例模式 意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现 ...
- 设计模式之第18章-观察者模式(Java实现)
设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...
- Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer
Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer: 启动Zookeeper 启动Kafka0.11 创建一个新的Topic: ./kafk ...
- 学C#之设计模式系列笔记(2)观察者模式
一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,观察者模式,https://zh.wikipedia.o ...
- 《JS设计模式笔记》 3,观察者模式
<script type="text/javascript"> //挂插着模式又叫发布订阅模式应该是最常用的模式 //1,dom事件就是观察者模式,只要订阅了click ...
- javascript设计模式与开发实践阅读笔记(8)——观察者模式
发布-订阅模式,也叫观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 在JavaScript开发中,我们一般用事件模型来替代传统的观察者模式. ...
- PHP设计模式笔记七:观察者模式 -- Rango韩老师 http://www.imooc.com/learn/236
观察者模式 概述: 1.观察者模式(Observer),当一个对象状态发生改变时,依赖他的对象全部会收到通知,并自动更新 2.场景:一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在事件的代 ...
随机推荐
- Find them, Catch them(poj 1703)
题目大意: 在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙输入D x y代表x于y不在一个团伙里输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里 思路 ...
- hadoop启动后jps没有namenode(转)
hadoop启动后jps没有namenode 一般都是由于两次或两次以上格式化NameNode造成的,有两种方法可以解决: 1.删除DataNode的所有资料 2.修改每个DataNode的names ...
- svn 文件夹 无法提交
[root@v01 www]# svn add localsvn/kkk/ svn: warning: 'localsvn/kkk' is already under version control ...
- Javascript模块化编程之路——(require.js)
转自:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html Javascript模块化编程(一):模块的写法 随着网站逐渐变成&q ...
- Hibernate日常应用的相关问题
1.在控制台中显示Hibernate打印的SQL中的参数 默认情况下,hibernate的sql中都是以问号代表参数,并没有显示参数的真实值,但是也不是做不到,只需要两步配置就可以显示出参数的真实值了 ...
- Android中几种定位 方式
介绍的几种定位方式 http://www.cnblogs.com/cuihongyu3503319/p/3863867.html 百度地图api: http://lbsyun.baidu.com/in ...
- hdu 1166 线段树单点更新
等线段树复习完再做个总结 1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Case 1:633 ...
- AltiumDesigner学习笔记(一)——创建工程与原理图文件
一.创建工程与原理图文件 1.通过菜单创建PCB工程 (1)File - New - Project - PCB Project,即可在当前工作区创建新的PCB工程 (2)新建工程并不直接在硬盘中创建 ...
- 如何清除sql server日志
1.打开查询分析器,输入命令 DUMP TRANSACTION 数据库名 WITH NO_LOG 2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件-- ...
- 利用jquery给指定的table动态添加一行、删除一行
转自:http://www.cnblogs.com/linjiqin/p/3148181.html $("#mytable tr").find("td:nth-child ...