模式定义

观察者模式(observer pattern): 定义对象间的一种一对多(或一对一)的依赖关系,当被观察者状态发生改变时,注册的观察者都会被通知。

观察者模式又称 发布-订阅(publish/subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式

模式动机

建立一种对象和对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象收到通知各自处理自己的业务逻辑。这里发生改变的对象称为被观察者,被通知的对象称为观察者。这些观察者之间没有关系,可以根据业务需求添加或删除观察者,便于系统维护和扩展。

模式结构

Subject(目标)

ConcreteSubject(具体目标)

Observer: 观察者

ConcreteObserver:具体观察者

UML 图

代码示例

代码实现的场景: 假设有个一个商人卖东西,他的用户有穷人和富人两类,商人的商品可能会涨价也可能会降价 价格波动对穷人和富人的购买行为有不同的影响。

分析: 这里的观者目标是 商品价格 ,被观察者是穷人和富人,商品价格变化将会通知穷人和富人,穷人富人对购买做出不同的反映。

// 目标

interface Observables

{

public function attach(Observer $ob);

public function detach(Observer $ob);

public function notify();

}

// 具体目标

class Saler implements Observables

{

protected $obs = [];

protected $range = 0;

public function attach(Observer $ob)

{

$this->obs[] = $ob;

}

public function detach(Observer $ob)

{

foreach ($this->obs as $k=>$v){

if($v != $ob){

$this->obs[] = $v;

}

}

}

public function notify()

{

// $this->range 为0表示价格不变 大于0涨价 小于0降价

if($this->range != 0){

foreach ($this->obs as $ob) {

$ob->update($this);

}

}

}

public function increPrice($range)

{

$this->range = $range;

}

public function getRange()

{

return $this->range;

}

}

// 观察者

interface Observer

{

public function update(Observables $obv);

}

//具体观察者(穷人)

class PoorBuyer implements Observer{

public function update(Observables $obv)

{

if($obv->getRange()>0){

echo '穷人:涨价不买了';

}else{

echo '穷人:降价了赶紧买';

}

}

}

//具体观察者(富人)

class RichBuyer implements Observer{

public function update(Observables $obv)

{

echo '富人:价格波动没关系,继续购买
';

}

}

模式应用场景

一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用

一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。

一个对象必须通知其他对象,而并不知道这些对象是谁。

需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

php观察者模式使用场景,php设计模式系列--观察者模式相关推荐

  1. Java设计模式系列--观察者模式(使用)

    原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...

  2. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  3. java观察者模式本质_6.[研磨设计模式笔记]观察者模式

    1.定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新. 2.解决问题 --订阅报纸 看起来订阅者是直接根有据打交道,但实际上,订阅者的订阅数据 ...

  4. java设计模式 观察者模式_理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...

  5. Javascript乱弹设计模式系列(1) - 观察者模式(Observer)

    前言 博客园谈设计模式的文章很多,我也受益匪浅,包括TerryLee.吕震宇等等的.NET设计模式系列文章,强烈推荐.对于我,擅长于前台代码的开发,对于设计模式也有一定的了解,于是我想结合Javasc ...

  6. 设计模式系列之「观察者模式」

    最近小Y在看<反黑>这部剧,最引人回味的是堪称经典的山鸡哥飞上枝头变凤凰,当初的古惑仔弃暗投明做警察,可谓是涅槃重生啊. 张sir: 山鸡,和兴盛最近很嚣张啊,该是你大展身手的时候了,你要 ...

  7. 【设计模式】观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.观察者模式简介 二.观察者模式适用场景 三.观察者模式优缺点 四.观察者模式代码示例 1.被观察者 2.观察者 3.通知类 4.测试类 五.JDK 中的观察者模式支持类 1.Observ ...

  8. Spring源码学习笔记:经典设计模式之观察者模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.观察者模式(Observer Pattern) 观察者模式也叫发布订阅模式.定义了对象之间的一对多依赖,让 ...

  9. 「补课」进行时:设计模式(15)——观察者模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 观察者模式 2.1 定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经 ...

最新文章

  1. 【OpenCV 4开发详解】Laplacian算子
  2. python就业前景分析-Python就业前景如何?老男孩Python培训好吗?
  3. unity3d 各个目录的意思
  4. tomcat jsvc java_opts_Tomcat 学习笔记(2) - 使用 jsvc 启动tomcat
  5. 7,7显示选中的目标信息
  6. 什么?你的电商网页不够时尚?看这里
  7. 如何在Qt Creator中导入图标资源
  8. 考研数学线上笔记(四):凯哥极限与连续概念选择题系列课程
  9. 网络层-IP地址和MAC地址
  10. 红外图像和可见光图像异源图像配准问题研究
  11. D7000、60D、K5、E5的详细对比评价(转)
  12. 微信公众平台开发网页开发
  13. Unity3D-人物角色选择
  14. 点亮显示屏的几个重要步骤
  15. mac 电脑使用小鹤音形和小鹤双拼
  16. The following packages have unmet dependencies错误
  17. iText如何设置行距
  18. 智慧交通:地铁站 3D 可视化,车路协同赋能科学出行
  19. 小米捐赠5亿助力教育普惠,“小米奖助学金”第二批高校报名启动
  20. 学习Stephen Liu的《SQLite学习手册(数据表和视图)》(一)

热门文章

  1. LeetCode(1021)——删除最外层的括号(JavaScript)
  2. 计算机网络学习笔记(6. 多路复用)
  3. 句句真研—每日长难句打卡Day17
  4. 生活中有哪些越早明白越好的道理?
  5. 竞价排名才是万恶之源
  6. 就算给穷人一百万,他们也很难赚到一块钱利润
  7. 我们每个人都想在事业上获得成功,但做到的人往往凤毛麟角
  8. 所有的生意都是在做两件事
  9. 多目标跟踪全解析,全网最全
  10. 为什么设置二级路由器要断开WAN?