引言
 
  所属:行为型模式,常用设计模式之一
 
    学习资料:
  • 《大话设计模式》程杰
模式概述
 
  观察者模式定义了一种一对多的依赖关系,让多个观察者对象监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己
 
  应用场景:当一个对象的改变需要同事改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
  观察者模式所作的工作其实就是在接触耦合。让耦合的双方都依赖于抽象类,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化
 
举个栗子
 
    一家公司,用户A喜欢玩游戏,用户B喜欢看股票,上班不好好工作,经常被老板抓到,然后两人想了一个方案:贿赂前台妹子,当老板到前台的时候嘱咐前台妹子通知一下,也好不被抓到,那么程序如何设计呢。
       
 
    流程图如下:
      
          

  
程序设计代码:
1. 抽象观察者,具体观察者
<?php
/**
* 抽象观察者
*/
namespace observer_factory; abstract class ObserverAbstract
{
public abstract function update($news);
}
<?php

/**
* 正在玩的员工
*/
namespace observer_factory; class NbaObserver extends ObserverAbstract
{
protected $name; protected $secretary; public function __construct(string $name, SubjectInterface $secretary)
{
$this->name = $name; $this->secretary = $secretary;
} /**
* 收到通知后的具体操作
* @param $news
*/
public function update($news)
{
echo $this->name.$news.'不要在玩了,继续工作!';
}
}
<?php
/**
* 正在炒股的用户
*/
namespace observer_factory; class StockObserver extends ObserverAbstract
{
protected $name; protected $secretary; public function __construct(string $name, SubjectInterface $secretary)
{
$this->name = $name; $this->secretary = $secretary;
}
/**
* 收到通知后的具体操作
* @param $news
*/
public function update($news)
{
echo $this->name.$news.'不要在看股票,继续工作!';
}
}

2. 抽象通知者,具体通知者

<?php
/**
* 抽象通知者
*/
namespace observer_factory; interface SubjectInterface
{
/**
* 增加同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function attach($key, ObserverAbstract $observer); /**
* 删除同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function detach($key); /**
* 发送消息
*/
public function notify(); /**
* @param $news
*/
public function secretaryNews($news);
}
<?php
/**
* 通知者A
*/
namespace observer_factory; class SubjectA implements SubjectInterface
{
/**
* 同事列表
*/
private $list = []; private $news; /**
* 增加同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function attach($key, ObserverAbstract $observer)
{
$this->list[$key] = $observer;
} /**
* 删除同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function detach($key)
{
unset($this->list[$key]);
} /**
* 发送消息
*/
public function notify()
{
foreach ($this->list AS $val) {
$val->update($this->news);
}
} /**
* @param $news
*/
public function secretaryNews($news)
{
$this->news = $news;
}
}
<?php

namespace observer_factory;

class SubjectB implements SubjectInterface
{
/**
* 同事列表
*/
private $list = []; private $news; /**
* 增加同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function attach($key, ObserverAbstract $observer)
{
$this->list[$key] = $observer;
} /**
* 删除同事
* @param ObserverAbstract $observer 针对抽象变成,减少了与具体类的耦合,也就是只有在继承抽象观察者的具体观察者才可以使用
*/
public function detach($key)
{
unset($this->list[$key]);
} /**
* 发送消息
*/
public function notify()
{
foreach ($this->list AS $val) {
$val->update($this->news);
}
} /**
* @param $news
*/
public function secretaryNews($news)
{
$this->news = $news;
}
}

3. 测试

<?php

namespace observer_factory;

include '../autoload.php';

// 通知者A 进行通知
$tongzhizhe = new SubjectA();
$tongshi1 = new NbaObserver('用户A', $tongzhizhe);
$tongshi2 = new StockObserver('用户B', $tongzhizhe); $tongzhizhe->attach('用户A', $tongshi1);
$tongzhizhe->attach('用户B', $tongshi2); $tongzhizhe->secretaryNews('老板回来了');
$tongzhizhe->notify();
 
以下为源码地址

  

  GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master

「PHP」观察者模式模式的更多相关文章

  1. 「PHP」策略模式

    引言   所属:行为型模式,常用设计模式之一     学习资料: <大话设计模式>程杰   模式概述   分享一篇关于策略模式讲的很好的文章,大家可以参考一下:https://www.cn ...

  2. 「技巧」如何将Sketch改为深色模式

    之前Sketch只能根据mac系统的外观设置变更皮肤.在更新了版本54之后,可以脱离操作系统,在自己的偏好设置中更改外观了. 准备 Sketch 54 更多工具:whose.design 第一步:打开 ...

  3. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  4. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  5. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  6. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  7. 「2014-2-6」TokuMX and MongoDB related materials collection

    简介参考 TokuMX 和 MongoDB 各自的官方站点.       ##  Tokutek 最重要的特点和 marketing word 是所谓 fractal tree indexing te ...

  8. jvm系列(十):如何优化Java GC「译」

    本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...

  9. React + Node 单页应用「二」OAuth 2.0 授权认证 & GitHub 授权实践

    关于项目 项目地址 预览地址 记录最近做的一个 demo,前端使用 React,用 React Router 实现前端路由,Koa 2 搭建 API Server, 最后通过 Nginx 做请求转发. ...

随机推荐

  1. Android学习——文件存储

    在Andriod开发中,文件存储和Java的文件存储类似.但需要注意的是,为了防止产生碎片垃圾,在创建文件时,要尽量使用系统给出的函数进行创建,这样当APP被卸载后,系统可以将这些文件统一删除掉.获取 ...

  2. js 时间格式化 (兼容safari)

    js 时间格式化,兼容IE8和safari浏览器. function formatDate(date, fmt, near, type) { var dateStr = date; if (!date ...

  3. tcp三次握手和四次挥手(2)

      背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进 ...

  4. HTML 折行br

    HTML 折行 如果您希望在不产生一个新段落的情况下进行换行(新行),请使用 <br /> 标签: <p>This is<br />a para<br /&g ...

  5. leetcode-valid number ZZ

    http://blog.csdn.net/kenden23/article/details/18696083 本题是十分麻烦的题目,情况是非常多,网上也很多方法,其中最有效,优雅的方法是有限状态自动机 ...

  6. mysql 配置详解

    [client]port = 3306socket = /tmp/mysql.sock [mysqld]port = 3306socket = /tmp/mysql.sock basedir = /u ...

  7. mssql删除数据库、删除帐号错误解决方法

    1. 删除数据库或者恢复数据库时,一定要先将数据库离线,在执行删除.恢复操作. SQL代码如下: /*使数据库离线*/ ALTER DATABASE [数据库名] SET OFFLINE WITH R ...

  8. shell单引号双引号详解

    linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了) " "(双引号)与 ' '(单引号)的区别    你在shell prompt(shell 提示)后面敲 ...

  9. ldconfig: /usr/lib/libpython2.6.so.1.0-gdb.py is not an ELF file - it has the wrong magic bytes at the start.

    https://bugzilla.redhat.com/show_bug.cgi?id=562980

  10. WAKE-WIN10-SOFT-环境

    操作系统名称 Microsoft Windows 10 专业版版本 10.0.14393 版本 14393其他操作系统描述 没有资料操作系统制造商 Microsoft Corporation系统名称 ...