定义:观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

注意:实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。

文件目录
Client.class.php
Event.class.php
EventAbstract.class.php
Observer.class.php
ObserverOne.class.php
ObserverTwo.class.php

Observer.class.php

<?php
namespace Observer;//观察者接口
interface Observer
{//指定观察者类必须实现notice_receive方法function notice_receive($info = null);
}

EventAbstract.class.php

<?php
namespace Observer;//事件产生者(被观察者)
abstract class EventAbstract
{//保存众多观察者实例private $observers = array();//事件触发(强制要求子类定义该方法)public abstract function trigger();//添加观察者function addObserver(Observer $observer){$this->observers[] = $observer;}//通知观察者//该方法中也可以形成事务,一个观察者实例通知返回不行,则全部返回function notify(){foreach ($this->observers as $val) {//观察者实例本身的方法notice_receive()接收消息并通知观察者,观察者本身对应事件处理方法//并根据情况是否传值通知$val->notice_receive();}}
}

Event.class.php

<?php
namespace Observer;
require_once 'EventAbstract.class.php';
//具体事件
class Event extends EventAbstract
{//事件触发(被父类强制要求定义该方法))function trigger(){echo "事件发生,开始干事情了<br/>";echo "干完该通知观察者实例数组(保存在抽象事件的private属性里)中的观察者了,幸好我是继承了抽象事件,虽然看不见,但是在存储空间中有,而我新增的方法不行,但使用来自基类的通知观察者方法notify就行<br/>";//通知观察者$this->notify();//从父类继承的通知观察者的方法}
}

ObserverOne.class.php

<?php
namespace Observer;
require_once 'Observer.class.php';
//观察者1
class ObserverOne implements Observer
{//接口的方法名是update,继承接口的类中必须有updatefunction notice_receive($info = null){echo "观察者1接收到通知,反应出不高兴<br/>";}
}

ObserverTwo.class.php

<?php
namespace Observer;
require_once 'Observer.class.php';
//观察者1
class ObserverTwo implements Observer
{//接口的方法名是update,继承接口的类中必须有updatefunction notice_receive($info = null){echo "观察者2接收到通知,反应高兴<br/>";}
}

Client.class.php

//客户端
class Client
{static function Test(){$observerone = new ObserverOne();$observertwo = new ObserverTwo();//实例事件$event = new Event();//把观察者加入到事件观察者数组中,这样事件发生事件就知道通知谁,谁是观察者$event->addObserver($observerone);$event->addObserver($observertwo);//这是具体事件继承抽象事件的方法,用于实现具体事件内部逻辑,//也是实现其继承抽象事件的notify方法通知每个在观察者实例数组的观察者,使观察者实现继承于接口的update方法,每个观察者可以反映不一$event->trigger();}
}
Client::Test();

测试结果:

事件发生,开始干事情了
干完该通知观察者实例数组(保存在抽象事件的private属性里)中的观察者了,幸好我是继承了抽象事件,虽然看不见,但是在存储空间中有,而我新增的方法不行,但使用来自基类的通知观察者方法notify就行
观察者1接收到通知,反应出不高兴
观察者2接收到通知,反应高兴

PHP设计模式之一:观察者模式相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

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

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

  3. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. 设计模式 C++观察者模式

    无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...

  6. 学习《图说设计模式》观察者模式

    图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...

  7. 设计模式之观察者模式——猫抓老鼠2

    设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...

  8. 设计模式之观察者模式——猫抓老鼠1

    设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...

  9. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  10. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

最新文章

  1. SwiftSuspenders 1.6-深入浅出1
  2. Eclipse常用的高效插件
  3. TClientDataSet[28]: 读写其他格式的 XML 文件
  4. C#控制DataMax指令打印DPL问题总结
  5. POJ2774 Long Long Message
  6. 查询DB中每个表占用的空间大小
  7. 报告 | 斯坦福2019 AI年度报告出炉!700亿美元投入AI,自动驾驶融资最多
  8. web前端之框架(frameset)
  9. Application Request Routing (ARR) TIME OUT 502
  10. gulp教程之gulp-htmlmin压缩html
  11. CentOS 6.5 x64 Redis 安装
  12. 计算机财务管理模型组成要素,计算机财务管理复习
  13. namecheap 从域名绑定到SSL配置
  14. 十八.国民技术MCU开发之UART模块LIN模式主从通信交互案例
  15. SC16IS752调试
  16. 初学用于华为鸿蒙系统(HarmonyOS)的编程开发工具HUAWEI DevEco Studio:你好,鴻蒙~
  17. AIT Worldwide Logistics与卡利塔航空建立民航预备队合作伙伴关系
  18. 短时傅里叶变换(STFT)实例
  19. Frontline ComProbe Protocol Analysis System(CPAS)简单使用说明
  20. hadoop可能会遇到的问题

热门文章

  1. 自适应学习系列(一)IRT简介
  2. 清华大学python吴萍答案_第732章 清华大学计算机系的扛把子
  3. 今日谈:BoltDB数据库,一款纯Go实现的KV数据库
  4. 一周用python完成2048小游戏
  5. pcb-新手入门级(注意事项)(避坑)
  6. Comsol动网格使用
  7. 【blender建模功能】02 内插面工具
  8. 使用Samba或NFS实现文件共享
  9. 基于寄生-捕食算法的函数寻优算法
  10. Lingo:软件简介与优化问题【数学建模工具】