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

    初识广播 BroadCast即为广播,为安卓四大组件之一,用于在应用程序和Activity间传输信息.一条广播,分为发送和接收两部分,发送方通过Intent存储信息,并进行发送.接收方通过BroadC ...

  2. June 23rd 2017 Week 25th Friday

    Life doesn't get easier, you just get stronger. 生活从未变得轻松,是你在一点一点变得坚强. So in the same way we can get ...

  3. Apache PredictionIO在Docker上的搭建及使用

    1.Apache PredictionIO介绍 Apache PredictionIO 是一个孵化中的机器学习服务器,它可以为为开发人员和数据科学家创建任何机器学习任务的预测引擎.官方原文: Apac ...

  4. 双十一问题:kafka消费能力低下原因思考

    抛去cpu.内存等机器原因,在每个分区皆分配一个进程消费的情况下,利用扩机器来提高kafka消费速率已无能为力 此时发现,在实际洪峰时段的消费速率元达不到先前压测时的消费速率 原因思考: 1.洪峰时段 ...

  5. IM

    一.IM技术概念 IM技术全称Instant Messaging,中文翻译"即时通讯",它是一种使人们能在网上识别在线用户并与他们实时交换消息的技术,是电子邮件发明以来迅速崛起的在 ...

  6. Webpack笔记(一)——从这里入门Webpack

    准备了挺久,一直想要好好深入了解一下Webpack,之前一直嫌弃Webpack麻烦,偏向于Parcel这种零配置的模块打包工具一些,但是实际上还是Webpack比较靠谱,并且Webpack功能更加强大 ...

  7. MATLAB入门学习(三)

    我们再来看看矩阵常用的函数,除了上一篇提到的inv还有以下常见命令: det 计算方阵行列式 eig 计算特征值 trace 计算矩阵的迹 norm 计算矩阵的范数或模 orth 正交化 poly 求 ...

  8. MATLAB入门学习(一)

    开始MATLAB入门啦,,,首先感谢xyy大神的帮助!然后我们开始学习吧!<( ̄︶ ̄)↗[GO!] 工作空间窗口:保存了你定义的常量,变量之类的,可以保存也可以被调用. 保存的话会生成一个mat ...

  9. POJ-1845 Sumdiv---因子和(快速幂+快速加法+因子和公式)

    题目链接: https://cn.vjudge.net/problem/POJ-1845 题目大意: 求AB的因子和 解题思路: 先将A质因数分解,然后B次方的质因数指数就是乘上B即可 这里要mod9 ...

  10. PHP中将字符串转化为整数(int) intval() printf()

    int <?php $foo = "1"; // $foo 是字符串类型 $bar = (int)$foo; // $bar 是整型 ?> intval <?ph ...