引言
 
  所属:行为型模式,常用设计模式之一
 
    学习资料:
  • 《大话设计模式》程杰
模式概述
 
  观察者模式定义了一种一对多的依赖关系,让多个观察者对象监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己
 
  应用场景:当一个对象的改变需要同事改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
  观察者模式所作的工作其实就是在接触耦合。让耦合的双方都依赖于抽象类,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化
 
举个栗子
 
    一家公司,用户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. canvas中的非零环绕原则

    非零环绕原则: 如果需要判断某一个区域是否需要填充颜色. 就从该区域中随机的选取一个点. 从这个点拉一条直线出来, 一定要拉到图形的外面. 此时以该点为圆心.看穿过拉出的直线的线段. 如果是顺时针方向 ...

  2. WCF安全 z

    WCF custom authentication using ServiceCredentials The generally accepted way of authenticating a us ...

  3. C#中的多线程 - 同步基础 z

    原文:http://www.albahari.com/threading/part2.aspx 专题:C#中的多线程 1同步概要Permalink 在第 1 部分:基础知识中,我们描述了如何在线程上启 ...

  4. c# 命名空间之System.IO(继承关系)

    System.IO 命名空间包含允许:读写文件.数据流的类型以及提供基本文件和目录支持的类型. 在这个命名空间中主要的类有: 字节流:Stream.BufferedStream.MemoryStrea ...

  5. RuntimeBroker ClipboardBroker EoP

    datetime: 2017.04.28 漏洞简介 随着沙箱技术的普及,现在主流的操作系统及软件都开始支持沙箱,以此来缓解层出不穷的远程代码执行漏洞对系统造成的危害.AppContainer是自Win ...

  6. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

  7. 《Tomcat与Java Web开发技术详解》思维导图

    越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...

  8. 使用with子句优化代码中重复查询

    /*好处: 1. 性能更好,一份复制(类似SYS_TMP...),多份使用.       2. 结构清晰,预先定义.       3. 代码修改不必修改多处.       请注意观察语句1和语句2执行 ...

  9. easyui学习笔记7—在手风琴中显示表格

    在这一篇中我们看看如何在手风琴里面显示表格数据的. 1.先看看引用的资源 <link rel="stylesheet" type="text/css" h ...

  10. SAP S/4HANA CDS View的访问控制实现:DCL介绍

    来自我的同事Xu Miles Authorization Objects are business concept, they are distinguished by business scenar ...