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程序的方法
Mar 09 PHP
php设计模式 Bridge (桥接模式)
Jun 26 PHP
php使用mkdir创建多级目录入门例子
May 10 PHP
php自定义hash函数实例
May 05 PHP
php 利用array_slice函数获取随机数组或前几条数据
Sep 30 PHP
PHP缓冲区用法总结
Feb 14 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
微信支付开发发货通知实例
Jul 12 PHP
php验证身份证号码正确性的函数
Jul 20 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
PHP设置images目录不充许http访问的方法
Nov 01 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 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 和 MySQL 时区的一点总结
2008/03/26 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
php短信接口代码
2016/05/13 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
javascript打印输出json实例
2013/11/11 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
vue柱状进度条图像的完美实现方案
2019/08/26 Javascript
python实现telnet客户端的方法
2015/04/15 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
python实现扫描日志关键字的示例
2018/04/28 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
机械系大学毕业生推荐信
2013/11/27 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
班级读书活动总结
2014/06/30 职场文书
就业协议书范本
2014/10/08 职场文书
python微信智能AI机器人实现多种支付方式
2022/04/12 Python