一、概述

1、观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

2、场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码。
观察者模式实现了低耦合,非侵入式的通知与更新机制。

3、观察者模式包含的角色:
  ①Subject: 目标

  ②Observer: 观察者

  ③ConcreteSubject: 具体目标

  ④ConcreteObserver: 具体观察者

二、代码实现

1)抽象观察目标

/** 抽象观察目标,定义观察目标要实现的方法* */
abstract class Subject
{//定义数组存储观察目标protected $observers = array();//添加观察者abstract public function addObserver(Observer $observer);//删除观察者abstract public function delObserver(Observer $observer);//满足条件时通知所有观察者的操作abstract public function notify();//发起通知的条件abstract public function condition($num);
}

2)观察者接口

/*** 观察者接口,定义所有观察者共同具有的操作——执行修改*/
interface Observer
{function update();
}

3)具体观察目标

/** 具体观察目标*/
class ConcreteSubject extends Subject
{//添加观察者public function addObserver(Observer $observer){$this->observers[] = $observer;}//移除观察者public function delObserver(Observer $observer){$key = array_search($observer, $this->observers);if ($key !== false) {  //注意不要写成!=,表达式0!=flase为flaseunset($this->observers[$key]);}}//通知所有观察者去操作public function notify(){foreach ($this->observers as $key => $value) {$value->update();}}//发起通知的条件public function condition($num){if ($num > 100) {$this->notify();}}
}

4)具体观察者

/** 具体观察者:观察者A* */
class ConcreteObserverA implements Observer
{function update(){echo "A报告:敌军超过一百人了,快撤!<br>";}//其他函数function eat(){echo "A在吃饭";}
}/** 具体观察者:观察者B* */
class ConcreteObserverB implements Observer
{function update(){echo "B报告:敌军超过一百人了,快撤!<br>";}//其他函数function sleep(){echo "B在睡觉";}
}

5)测试

//测试
$a       = new ConcreteObserverA();
$b       = new ConcreteObserverB();
$subject = new ConcreteSubject();$subject->addObserver($a);
$subject->addObserver($b);
$subject->condition(1000);

转载于:https://www.cnblogs.com/jxl1996/p/10185267.html

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. Java大厂技术文档:Redis+Nginx+设计模式+Spring全家桶+Dubbo精选
  2. pythorch学习笔记
  3. Enums and Structs in C#(C#里的枚举和结构) (from codeproject)
  4. 成功驱动HD4600-Clover引导
  5. python音乐下载器-支持所有主流平台-python脚本源码下载
  6. java vector内存结构_4. Java集合知识测试
  7. FilterAttribute过滤器的 执行顺序
  8. 前后端分离 与 不分离
  9. C陷阱与缺陷--读书笔记3 语义“陷阱”
  10. GANs(生成对抗网络)初步
  11. n3k配置vpc是否还需要配置hsrp_HSRP
  12. 升45武器并不一定大黑铁 自然+13的飞魂 (传奇3G)
  13. 计算机学院研发------考核之界面
  14. 网易严选App感受Weex开发
  15. TOEFL wordlist 35
  16. GCC学习(动态库与静态库.a与.so)
  17. 勇敢码农,不怕困难!阿里内部不外传秘籍50万字Java面试手册奉上
  18. 数字SOC设计之低功耗设计入门(一)——低功耗设计目的与功耗的类型
  19. 关于UNITY3d摄像机跟随人物转动的脚本
  20. HC-SR501红外热释电传感器

热门文章

  1. [Java] 蓝桥杯ADV-175 算法提高 三个整数的排序
  2. 曲线拟合最小二乘法对数c语言实现,数值计算_第6章曲线拟合的最小二乘法
  3. 克服跨洋网络延迟,使用Docker Hub Mirror加速Docker官方镜像下载
  4. 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数
  5. Nginx 安装与使用
  6. window7 已经分好区的硬盘如何再次分区?
  7. 透彻理解Java并发的等待队列——Condition
  8. 虚拟无线接入网:行业的演进方向
  9. Ubuntu 16.04安装Guake Terminal终端(使用一键唤醒功能)
  10. oc语言学习之基础知识点介绍(三):类方法、封装以及继承的介绍