用模式开发的优点是,能让我们的逻辑结构以及代码更加清晰,便于维护!

而我们为什么要用 “观察者模式”?这就需要从实际运用中来理解才能更好的运用!用如下的情境来说明吧。

事例,开始时我被安排做项目的登录,很快我就完成了。然后产品提出了另一个需求,用户登录后,给他们推送一条实时消息!然后我在登录成功的逻辑后加了一段代码,完成了登录后的实时消息推送。然而事情还没有完,产品又给加了个需求,需要给新登录的用户10块钱红包奖励,这个当然很简单,我又在消息推送后加了代码,完成了新登录用户的红包奖励(钱怎么到账的过程暂且不论),然而事情还没完没了了,产品不断的在加需求了,如非vip用户登录,给他推送10条需要注册VIP才能打开的信息,如根据客户习惯推送10条客户偏好的信息,如vip快到期的客户需要在客户登录后提醒要充值啦。。。。。。。等等,如是这般,那我就得不停的在登录后加代码,变得我开始看不懂哪个xxx写的代码了!

那么此时我们就得考虑用‘观察者模式’了

可以以这样的方式简单明了形容 观察者模式, 某个商场门口安排一个人进行观察,观察到有a类型的顾客进门,立即安排敲锣、打鼓、送鲜花,观察到有b类客户,立即安排购物袋,观察到c类客户,嗯嗯感觉他是来打酱油了,安排不要浪费表情了,什么欢迎仪式也没有。。。。。也就是说 观察者就是个‘势利眼’,看人下彩,根据观察给进来的顾客安排对应的某个服务或者某些服务!也许这个形容还不够恰当,但大体意思差不多了。

接下来就是重点了,描述了观察者模式的轮廓,那么就需要转化为代码来实际运用了!

一、首先得有两个接口类,用以框定观察者模式,

一个被观察者接口类(一般申明有三个必须方法:1.添加观察者对象的方法,2.删除观察者对象的方法 ,3.通知观察者进行  相应执行的方法),

一个观察者接口类(一般只有一个必须方法,就是执行)

如果直接甩代码可能有点难理解,那么就先给个示意图来明确一下吧!

二、根据观察者接口类的框定我们定下接口类如下代码:

(示例是网上抄的,因为易于理解,申明一下出处,网址:https://www.cnblogs.com/DeanChopper/p/4830134.html):

<?php
// 被观察者接口
interface Subject{public function register(Observer $observer);  //添加(注册)观察者对象public function detach(Observer $observer);    //删除观察者对象public function notify();                      //通知观察者执行相应功能
}
// 观察者接口
interface Observer{public function watch();   //观察者要执行的方法
}

三、根据框定的结构,大概的理解一下就是,要实现 被观察者对象 存储各种观察者对象(完成各种功能的对象)存储起来,然后通只各观察者执行自己的功能,先看看如下的实现代码

<?php
// 被观察者继承类
class Action implements Subject{public $_observers=array(); //用于存储观察者对象//用于添加(注册)观察者对象public function register(Observer $observer){$this->_observers[]=$observer;}//用于删除观察者对象public function detach(Observer $observer){$index = array_search($observer, $this->_observers);if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {return FALSE;}unset($this->_observers[$index]);return TRUE;}//通知各观察者public function notify(){//****重点,其实就是循环中执行各观察这对象的watch方法,不同功能方法内容不同但方法名相同foreach ($this->_observers as $observer) {$observer->watch();}}}// cat观察者继承类
class Cat implements Observer{public function watch(){echo "Cat watches TV<hr/>";}} //dog观察者继承类class Dog implements Observer{public function watch(){echo "Dog watches TV<hr/>";}} //people观察者继承类class People implements Observer{public function watch(){echo "People watches TV<hr/>";}}

好了,我们现在通过上面的继承就能明白了,观察者就是定义各种功能的对象(这些对象就是:比如给第一次登录的用户发红包,给用户最新的10条文章推送,给非vip用户推送10条需要注册才能打开的视频诱导用户开通vip。。。。),被观察者对象要实现的就是 将添加(注册)的观察者对象存储起来并逐个通知执行观察者各自的功能,

四、那么就进行实例化对象进行操作了!代码如下:

// 应用实例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();

到这里我想如果应该是有所理解了,如果我的理解有误请提建议,当然这只是观察者模式的一个简单过程,实际开发中会有所改动,当然大体脉络就是这样的!

还有一点个人的观点是,如果我们需要搞清楚各种开发模式运用,那么就要从它能解决的需求理解,面向对象编程它是来源于生活,应用于生活的,从这种模式解决的需求上进行理解,然后我们才能明白架构定义出来的代码(说得玄一点就是将 想法转化为代码来实现,通过代码 得到我们想要的结果) 。写下这些其实也不为其他,只是想加深自己的印象,同时也希望对其他 同行的朋友有所助益!

PHP 观察者模式 理解相关推荐

  1. JavaScript --- [学习笔记]观察者模式 理解对象 工厂模式 构造函数模式

    说明 本系列(JS基础梳理)为后面TCP的模拟实现做准备 本篇的主要内容: 观察者模式.工厂模式.构造函数模式 和 对对象的理解 1. 观察者模式 参考JavaScript设计模式 1.1 消息注册方 ...

  2. Angularjs 观察者模式 理解

    观察者模式 观察者模式从字面意思就能知道它主要是做什么的,所以理解起来不难,但实际实现还是有一些难度. 观察者模式是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得 ...

  3. Java观察者模式理解和实现

    今天本想一本正经的把RxJava看一看,想着前段时间RxJava都已经到了第二版,而自己RxJava的认识还只是很基础,甚至连基础都算不上,所以本着以后能在项目里优雅地把他用出来的想法,我开始了RxJ ...

  4. Laravel orm 观察者模式理解observe

    在开发中我们经常需要新增,修改...等模型操作 操作完成后需要触发个事件 以前一般的做法 <?php//例子1 $row = User::InsertGetId(['name'=>''张三 ...

  5. JavaScript --- [学习笔记] 原型模式

    说明 接JavaScript - > [学习笔记]观察者模式 & 理解对象 & 工厂模式 & 构造函数模式 上一篇构造函数模式创建的实例,不同实例的同一个方法是不相等的, ...

  6. EventBus源码分析

    简介 前面我学习了如何使用EventBus,还有了解了EventBus的特性,那么接下来我们一起来学习EventBus的源码,查看EventBus的源码,看看EventBus给我们带来什么惊喜以及编程 ...

  7. 《分布式消息中间件实践》 读书笔记

    写在前面 听人家总说这些,之前项目里也没有用到,其实挺好奇的,之前也没时间看.这里准备用这本书入门,查了一下,书评很一般,但是入门应该够了,而且200多页,正合适,生活加油 笔记主要是书的摘写,不懂的 ...

  8. Redis泛泛而谈(详细3W字)深入浅出Redis,十年阿里架构师分享:有了它还怕不懂Redis原理?

    本文适合于刚接触redis的,文章内容比较基础,大佬请绕道. 一.NoSQL入门和概述 Ⅰ-入门概述 1.为什么用NoSQL 1)单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单 ...

  9. BIGDATA-redis

    01.NoSQL入门概述 1.互联网时代背景下大机遇,为什么用NoSQL 1.单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付. 在那个时候,更多的都是静 ...

最新文章

  1. 3dsmax biped 骨骼的创建和修改
  2. Linux常用命令行
  3. python中yaml模块的使用_Python中Pyyaml模块的使用
  4. c语言写贪吃蛇什么水平_学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释...
  5. 慕尼黑工业大学最新综述:深度神经网络中的不确定性
  6. Python——基于PIL和CV2实现自动拼图解决方案
  7. html翻转切换div效果,图片翻转效果
  8. 橡胶支座抗压弹性模量计算公式_隔震支座的这些力学特性您都掌握了吗?
  9. 【华为云技术分享】一行代码就能写一个日志打印组件,你信吗?为你揭晓LiteOS中日志打印组件的核心
  10. printf打印二进制_优雅地打印 HEX 数据
  11. Problem F. Grab The Tree博弈
  12. poj Ancient Cipher 古代密码
  13. 十大排序算法——插入排序法(C语言)
  14. pyquery url初始化
  15. 2021-3-21-第三周
  16. 正在保存“index.vue”: 从 “‘Vetur‘, ‘ESLint‘“ (configure)中获取代码操作。
  17. 第5周作业 #高级编程技术
  18. nand flash 的oob 及坏块管理
  19. c语言开发套路-怎样快速调用别人的一套接口 api模型的抽象
  20. Wifi Direct 修改群组名称特别注意

热门文章

  1. 从零到壹搭建一个商城架构--k8s集群安装
  2. m2ts视频格式在windows及mac下的解决方案
  3. 产品需求分析与市场分析方法汇总(SWOT+PDCA+波士顿矩阵BCG+5W2H分析法+STAR关键事件分析法+目标管理SMART+时间管理紧急重要矩阵+WBS任务分解法)
  4. ubuntu server 14.04 编译安装xen4.4.2配置vtpm(二)——Dom0内核编译
  5. jqGrid API 及用法
  6. CDN服务及如何获取CDN服务背后的真实IP
  7. 收到字节 Offer,月薪 60k*18薪 ,爽的两夜都没睡着!
  8. 【tkinter组件专栏】Scrollbar:横滚竖滚滚动条
  9. 研究黑苹果系统——拯救者Y7000P-10875H
  10. 小半斤拔凉 支付Java 相关参考