PHP 观察者模式深入理解与应用分析


Posted in PHP onSeptember 25, 2019

本文实例讲述了PHP 观察者模式。分享给大家供大家参考,具体如下:

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

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

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

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

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

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

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

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

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

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

PHP 观察者模式深入理解与应用分析

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

(示例是网上抄的,因为易于理解,申明一下出处,网址:https://3water.com/article/170753.htm):

<?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程序设计有所帮助。

PHP 相关文章推荐
php 文件上传代码(限制jpg文件)
Jan 05 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
使用php显示搜索引擎来的关键词
Feb 13 PHP
PHP实现利用MySQL保存session的方法
Aug 23 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
Apr 30 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
Ubuntu 16.04下安装PHP 7过程详解
Mar 28 PHP
php array_reverse 以相反的顺序返回数组实例代码
Apr 11 PHP
php微信公众号开发之图片回复
Oct 20 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 PHP
php模式设计之观察者模式应用实例分析
Sep 25 #PHP
php创建类并调用的实例方法
Sep 25 #PHP
关于php开启错误提示的总结
Sep 24 #PHP
php集成开发环境详解
Sep 24 #PHP
php和nginx交互实例讲解
Sep 24 #PHP
php连接mysql数据库最简单的实现方法
Sep 24 #PHP
php和html的区别点详细总结
Sep 24 #PHP
You might like
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
php遍历目录方法小结
2015/03/10 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
jquery中event对象属性与方法小结
2013/12/18 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
详解用vue-cli来搭建vue项目和webpack
2017/04/20 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
使用Python 统计高频字数的方法
2019/01/31 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
增大python字体的方法步骤
2020/07/05 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
2020/11/20 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
应届生求职推荐信
2013/10/28 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
python实现简单的聊天小程序
2021/07/07 Python