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 无限极分类
Mar 27 PHP
PHP在字符断点处截断文字的实现代码
Apr 21 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
Jun 27 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
Mar 18 PHP
Yii配置文件用法详解
Dec 04 PHP
微信获取用户地理位置信息的原理与步骤
Nov 12 PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
Jun 06 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 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/19 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
JavaScript XML操作 封装类
2009/07/01 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
go语言计算两个时间的时间差方法
2015/03/13 Python
python 链接和操作 memcache方法
2017/03/04 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
python中cPickle类使用方法详解
2018/08/27 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
python实现人机猜拳小游戏
2020/02/03 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
法学研究生自我鉴定范文
2013/12/04 职场文书
总经理司机岗位职责
2015/04/10 职场文书
企业投资意向书
2015/05/09 职场文书
新员工辞职信范文
2015/05/12 职场文书
初一年级组工作总结
2015/08/12 职场文书