观察者模式(Observer)

3.7.1. 目的

当对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。它使用的是低耦合的方式。

3.7.2. 例子

使用观察者模式观察消息队列在 GUI 中的运行情况。

3.7.3. 注意

PHP 已经定义了2个接口用于快速实现观察者模式:SplObserver 和 SplSubject。

3.7.4. UML 图

3.7.5. 代码

你可以在  GitHub 查看这段代码。

User.php

namespace DesignPatterns\Behavioral\Observer;

/**

* User 实现观察者模式 (称为主体),它维护一个观察者列表,

* 当对象发生变化时通知 User。

*/

class User implements \SplSubject

{

/**

* @var string

*/

private $email;

/**

* @var \SplObjectStorage

*/

private $observers;

public function __construct()

{

$this->observers = new \SplObjectStorage();

}

public function attach(\SplObserver $observer)

{

$this->observers->attach($observer);

}

public function detach(\SplObserver $observer)

{

$this->observers->detach($observer);

}

public function changeEmail(string $email)

{

$this->email = $email;

$this->notify();

}

public function notify()

{

/** @var \SplObserver $observer */

foreach ($this->observers as $observer) {

$observer->update($this);

}

}

}

UserObserver.php

namespace DesignPatterns\Behavioral\Observer;

class UserObserver implements \SplObserver

{

/**

* @var User[]

*/

private $changedUsers = [];

/**

* 它通常使用 SplSubject::notify() 通知主体

*

* @param \SplSubject $subject

*/

public function update(\SplSubject $subject)

{

$this->changedUsers[] = clone $subject;

}

/**

* @return User[]

*/

public function getChangedUsers(): array

{

return $this->changedUsers;

}

}

3.7.6. 测试

Tests/ObserverTest.php

namespace DesignPatterns\Behavioral\Observer\Tests;

use DesignPatterns\Behavioral\Observer\User;

use DesignPatterns\Behavioral\Observer\UserObserver;

use PHPUnit\Framework\TestCase;

class ObserverTest extends TestCase

{

public function testChangeInUserLeadsToUserObserverBeingNotified()

{

$observer = new UserObserver();

$user = new User();

$user->attach($observer);

$user->changeEmail('foo@bar.com');

$this->assertCount(1, $observer->getChangedUsers());

}

}

php yii2 观察者模式,观察者模式(Observer)相关推荐

  1. C#设计模式之十六观察者模式(Observer Pattern)【行为型】

    C#设计模式之十六观察者模式(Observer Pattern)[行为型] 原文:C#设计模式之十六观察者模式(Observer Pattern)[行为型] 一.引言 今天是2017年11月份的最后一 ...

  2. 行为型设计模式(4)—— 观察者模式(Observer Pattern)

    文章目录 1.概述 2.实例 2.1 丑陋的设计 2.2 使用观察者模式 3.应用场景 4.优缺点 5.小结 参考文献 1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.观察者模式(O ...

  3. HeadFirst 设计模式(二)观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 在对象之间建立一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新. 设计原则 找出应用中可能需要变化之处,把它们独立出来, ...

  4. 设计模式--观察者模式(Observer)

    观察者模式(Observer) 在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变.例如,某种商品的物价上涨时会导致部分商家高兴,而消费者 ...

  5. 【设计模式】观察者模式(Observer)

    观察者模式 观察者模式的定义: 指多个对象间存在一对多的依赖关系,当一个对象发生改变时,所有依赖他的对象都会得到通知并自动更新. 这种模式又被称为发布-订阅模式.模型-视图模式,它是对象行为型模式. ...

  6. 【23种设计模式】观察者模式(Observer Pattern)

    个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客:这里是CSD ...

  7. 观察者模式(Observer Pattern)

    观察者模式又叫做订阅/发布模式 一个Subject,多Observer 相互之间持有引用 Subject可以调用Observer的函数执行相应操作 Observer发生变动时也可以通知Subject让 ...

  8. 艾伟_转载:.NET设计模式:观察者模式(Observer Pattern)

    概述 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将 ...

  9. .NET设计模式(19):观察者模式(Observer Pattern)

    概述 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将 ...

最新文章

  1. 【转】用示例说明索引数据块中出现热块的场景,并给出解决方案
  2. java中全大写字符_Java 大写字符串中的字符
  3. WinXP中快捷方式加箭头
  4. 【COCOS2DX隐藏IOS7状态栏】通过添加PLIST KEY隐藏IOS7状态栏
  5. B端产品经理,应从哪些方面理解业务?
  6. 构建嵌入式LINUX的NFS【ZT】
  7. matlab monte carlo,Monte Carlo Simulation
  8. CentOS下Apache服务器的安装与配置
  9. 基础选择器之通配符选择器(CSS、HTML)
  10. C# 读取Oracle数据库数据
  11. FFmpeg —— Linux下使用ffmpeg硬件cuda解码mp4,并加入简单cv处理,sdl渲染窗口(附源码)
  12. 谱瑞PS8625替代方案|PS8622替代方案|高性价比EDP转LVDS转接板方案CS5211设计开发
  13. Excel 如何批量查询快递单号
  14. 伪指令dd 和 操作符dup
  15. unity 彩带粒子_超级技术贴:Unity粒子遇上着色器,引爆视觉特效
  16. three.js绘制墙体,通过不规则路径生成墙体,3D墙体绘制
  17. 计算机如何取消左缩进,Word中怎么去掉表格的缩进
  18. C++调用两次析构函数原因
  19. 如何访问局域网内宿主机上的虚机服务
  20. python melt函数

热门文章

  1. Java:Linux上java -jar xxx.jar命令执行jar包时出现Error: Invalid or corrupt jarfile xxx.jar解决方案
  2. java.lang.IllegalArgumentException 不合法的参数异常
  3. 解决Win10 PowerShell无法激活Anaconda环境的问题
  4. 2018年1月3日-江苏地税系统无法正常登陆的解决方案
  5. android页面布局 如何让中间的listview填充剩余部分_不使用css3:flex怎么实现一些常见的移动端布局...
  6. win11设置打开闪退怎么办,解决win11系统闪退的问题
  7. CentOS[linux]操作系统的安装手册
  8. C#winform遍历控件判断控件类型
  9. css如何改变横线<hr/>标签的颜色
  10. Open3d之裁剪点云