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

本文实例讲述了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数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

(0)

相关推荐

  • PHP实现的观察者模式实例

    本文实例讲述了PHP实现的观察者模式.分享给大家供大家参考,具体如下: <?php //定义观察者调用接口 class transfer{ protected $_observers = array(); //注册对象 public function register($sub){ $this->_observers[] = $sub; } //外部统一调用 public function trigger(){ if(!empty($this->_observers)){ foreach

  • PHP的异常处理类Exception的使用及说明

    1.首先php5提供了基本的异常处理类,可直接使用 复制代码 代码如下: <?php class Exception { protected $message = 'Unknown exception'; // 异常信息 protected $code = 0; // 用户自定义异常代码 protected $file; // 发生异常的文件名 protected $line; // 发生异常的代码行号 function __construct($message = null, $code =

  • PHP使用观察者模式处理异常信息的方法详解

    本文实例讲述了PHP使用观察者模式处理异常信息的方法.分享给大家供大家参考,具体如下: 异常信息的捕获对编程测试有着重要的意义,这里结合观察者模式,探索如何处理异常信息. 关于观察者模式,如果还没有接触过的话,博客园有很多优秀的博友做了详细的 解释.笔者觉得,所谓观察者模式,必须有两个重要组成部分:一个主题对象,多个观察者.在使用的时候,我们可以将观察者像插头一样插到主题对象这个插座上,利用主题对象完成相应功能. 既然观察者要作为插头,必须要有一个统一的口径才能插到相同的插座上,因而先定义一个接

  • PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】

    本文实例讲述了PHP中常用的三种设计模式.分享给大家供大家参考,具体如下: PHP中常用的三种设计模式:单例模式.工厂模式.观察者模式 1.单例模式 为何要使用PHP单例模式? 多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育". 而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有

  • PHP观察者模式示例【Laravel框架中有用到】

    本文实例讲述了PHP观察者模式.分享给大家供大家参考,具体如下: <?php //观察者模式 //抽象主题类 interface Subject { public function attach(Observer $Observer); public function detach(Observer $observer); //通知所有注册过的观察者对象 public function notifyObservers(); } //具体主题角色 class ConcreteSubject imp

  • PHP设计模式之观察者模式(Observer)详细介绍和代码实例

    [意图] 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新[GOF95] 又称为发布-订阅(Publish-Subscribe)模式.模型-视图(Model-View)模式.源-监听(Source-Listener)模式.或从属者(Dependents)模式 [观察者模式结构图] [观察者模式中主要角色] 1.抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者. 抽象主题提供了增加和

  • php中异常处理方法小结

    本文实例总结了php中异常处理方法.分享给大家供大家参考.具体分析如下: 当异常被触发时,通常会发生:在PHP5中添加了类似于其它语言的错误异常处理模块.在 PHP代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获.需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常.每一个 try 至少要有一个与之对应的 catch. 使用多个 catch 可以捕获不同的类所产生的异常,当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP

  • php观察者模式应用场景实例详解

    本文实例讲述了php观察者模式的应用.分享给大家供大家参考,具体如下: <?php /** * 观察者模式应用场景实例 * * 免责声明:本文只是以哈票网举例,示例中并未涉及哈票网任何业务代码,全部原创,如有雷同,纯属巧合. * * 场景描述: * 哈票以购票为核心业务(此模式不限于该业务),但围绕购票会产生不同的其他逻辑,如: * 1.购票后记录文本日志 * 2.购票后记录数据库日志 * 3.购票后发送短信 * 4.购票送抵扣卷.兑换卷.积分 * 5.其他各类活动等 * * 传统解决方案: *

  • php设计模式之观察者模式定义与用法经典示例

    本文实例讲述了php设计模式之观察者模式定义与用法.分享给大家供大家参考,具体如下: <?php /** * @desc 利用观察者模式,实现不同用户进入显示不同的内容 * 1.主题 * 2.观察者接口 * 3.观察者 * ***/ interface Observer{ //添加观察者对象 public function attach($observer); //删除观察者对象 public function detach($observer); //执行观察者需要执行的方法 public f

  • 学习php设计模式 php实现观察者模式(Observer)

    一.意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新[GOF95] 又称为发布-订阅(Publish-Subscribe)模式.模型-视图(Model-View)模式.源-监听(Source-Listener)模式.或从属者(Dependents)模式 二.观察者模式结构图 三.观察者模式中主要角色 抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者.抽象主题提供了增加和删除观

  • PHP设计模式之观察者模式实例

    首先了解观察者模式的概念:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察.当可观察的对象更改时,它会将消息发送到已注册的观察者.这些观察者使用该信息执行的操作与可观察的对象无关.结果是对象可以相互对话,而不必了解原因.观察者模式是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间紧密耦. UML结构图: 观察者模式解决的问题 在我们的开发过程中,应该

随机推荐