PHP设计模式之观察者模式定义与用法分析


Posted in PHP onApril 04, 2019

本文实例讲述了PHP设计模式之观察者模式定义与用法。分享给大家供大家参考,具体如下:

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

场景:当一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新逻辑增多之后,代码变得难以维护,这种方式是耦合式的,侵入式的,增加新的逻辑需要改变事件主题的代码

观察者模式实现了低耦合,非侵入式的通知与更新

abstract class EventGenerator
{
  private $ObServers = [];
  //增加观察者
  public function add(ObServer $ObServer)
  {
    $this->ObServers[] = $ObServer;
  }
  //事件通知
  public function notify()
  {
    foreach ($this->ObServers as $ObServer) {
      $ObServer->update();
    }
  }
}
/**
 * 观察者接口类
 * Interface ObServer
 */
interface ObServer
{
  public function update($event_info = null);
}
/**
 * 观察者1
 */
class ObServer1 implements ObServer
{
  public function update($event_info = null)
  {
    echo "观察者1 收到执行通知 执行完毕!\n";
  }
}
/**
 * 观察者1
 */
class ObServer2 implements ObServer
{
  public function update($event_info = null)
  {
    echo "观察者2 收到执行通知 执行完毕!\n";
  }
}
/**
 * 事件
 * Class Event
 */
class Event extends EventGenerator
{
  /**
   * 触发事件
   */
  public function trigger()
  {
    //通知观察者
    $this->notify();
  }
}
//创建一个事件
$event = new Event();
//为事件增加旁观者
$event->add(new ObServer1());
$event->add(new ObServer2());
//执行事件 通知旁观者
$event->trigger();

运行结果:

观察者1 收到执行通知 执行完毕!
观察者2 收到执行通知 执行完毕!

1 抽象的事件产生类,定义一个添加观察者方法,和通知方法(执行观察者方法)

2 定义观察者接口,实现方法 ,观察者实现

3 定义具体实现类继承抽象事件,实现通知方法

4 创建对象,增加旁观者,更新

具体注册实例

<?php
 /**
 * 3.1php设计模式-观测者模式
 * 3.1.1概念:其实观察者模式这是一种较为容易去理解的一种模式吧,它是一种事件系统,意味
 *     着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,
 *     观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间
 *     紧密耦合的另一种方法
 * 3.1.2关键点:
 *    1.被观察者->追加观察者;->一处观察者;->满足条件时通知观察者;->观察条件
 *    2.观察者 ->接受观察方法
 * 3.1.3缺点:
 * 3.1.4观察者模式在PHP中的应用场合:在web开发中观察者应用的方面很多
 *    典型的:用户注册(验证邮件,用户信息激活),购物网站下单时邮件/短信通知等
 * 3.1.5php内部的支持
 *    SplSubject 接口,它代表着被观察的对象,
 *    其结构:
 *    interface SplSubject
 *    {
 *      public function attach(SplObserver $observer);
 *      public function detach(SplObserver $observer);
 *      public function notify();
 *    }
 *    SplObserver 接口,它代表着充当观察者的对象,
 *    其结构:
 *    interface SplObserver
 *    {
 *      public function update(SplSubject $subject);
 *    }
 */
 /**
 * 用户登陆-诠释观察者模式
 */
class User implements SplSubject {
  //注册观察者
  public $observers = array();
  //动作类型
  CONST OBSERVER_TYPE_REGISTER = 1;//注册
  CONST OBSERVER_TYPE_EDIT = 2;//编辑
  /**
   * 追加观察者
   * @param SplObserver $observer 观察者
   * @param int $type 观察类型
   */
  public function attach(SplObserver $observer, $type)
  {
    $this->observers[$type][] = $observer;
  }
  /**
   * 去除观察者
   * @param SplObserver $observer 观察者
   * @param int $type 观察类型
   */
  public function detach(SplObserver $observer, $type)
  {
    if($idx = array_search($observer, $this->observers[$type], true))
    {
      unset($this->observers[$type][$idx]);
    }
  }
  /**
   * 满足条件时通知观察者
   * @param int $type 观察类型
   */
  public function notify($type)
  {
    if(!empty($this->observers[$type]))
    {
      foreach($this->observers[$type] as $observer)
      {
        $observer->update($this);
      }
    }
  }
  /**
   * 添加用户
   * @param str $username 用户名
   * @param str $password 密码
   * @param str $email 邮箱
   * @return bool
   */
  public function addUser()
  {
    //执行sql
    //数据库插入成功
    $res = true;
    //调用通知观察者
    $this->notify(self::OBSERVER_TYPE_REGISTER);
    return $res;
  }
  /**
   * 用户信息编辑
   * @param str $username 用户名
   * @param str $password 密码
   * @param str $email 邮箱
   * @return bool
   */
  public function editUser()
  {
    //执行sql
    //数据库更新成功
    $res = true;
    //调用通知观察者
    $this->notify(self::OBSERVER_TYPE_EDIT);
    return $res;
  }
}
/**
* 观察者-发送邮件
*/
class Send_Mail implements SplObserver
{
  /**
   * 相应被观察者的变更信息
   * @param SplSubject $subject
   */
  public function update(SplSubject $subject)
  {
    $this->sendMail($subject->email, $title, $content);
  }
  /**
   *发送邮件
   *@param str $email 邮箱地址
   *@param str $title 邮件标题
   *@param str $content 邮件内容
   */
  public function sendEmail($email, $title, $content)
  {
    //调用邮件接口,发送邮件
  }
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
微盾PHP脚本加密专家php解密算法
Sep 13 PHP
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
PHP中的生成XML文件的4种方法分享
Oct 06 PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 PHP
Yii框架form表单用法实例
Dec 04 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 PHP
PHP实现的构造sql语句类实例
Feb 03 PHP
PHP框架性能测试报告
May 08 PHP
PHP实现判断数组是一维、二维或几维的方法
Feb 06 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 #PHP
PHP whois查询类定义与用法示例
Apr 03 #PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 #PHP
PHP反射实际应用示例
Apr 03 #PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 #PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
Apr 03 #PHP
PHP快速排序算法实现的原理及代码详解
Apr 03 #PHP
You might like
PHP中的array数组类型分析说明
2010/07/27 PHP
drupal 代码实现URL重写
2011/05/04 PHP
php模板原理讲解
2013/11/13 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
JS小功能(checkbox实现全选和全取消)实例代码
2013/11/28 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
python 对xml解析的示例
2021/02/27 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
介绍一下Java的安全机制
2012/06/28 面试题
销售人员中英文自荐信
2013/09/22 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
《雷雨》教学反思
2014/02/20 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
主要领导对照检查材料
2014/08/26 职场文书
教师业务学习材料
2014/12/16 职场文书
婚礼父母答谢词
2015/01/04 职场文书
生活小常识广播稿
2015/08/19 职场文书