PHP使用标准库spl实现的观察者模式示例


Posted in PHP onAugust 04, 2018

本文实例讲述了PHP使用标准库spl实现的观察者模式。分享给大家供大家参考,具体如下:

前面使用纯php实现了一个观察者模式(php观察者模式), 现在使用php标准库spl在次实现观察者模式,好处是:随意的生成您想使用的观察者!

<?php
/**
 * Created by PhpStorm.
 * User: evolution
 * Date: 14-12-27
 * Time: 下午5:50
 */
class Login implements SplSubject {
  private $storage;
  public $status;
  public $ip;
  const LOGIN_ACCESS = 1;
  const LOGIN_WRONG_PASS = 2;
  const LOGIN_USER_UNKNOWN = 3;
  function __construct(){
    $this->storage = new SplObjectStorage();
  }
  function attach (SplObserver $observer) {
    $this->storage->attach($observer);
  }
  function detach(SplObserver $observer){
    $this->storage->detach($observer);
  }
  function notify(){
    foreach ($this->storage as $obs) {
      $obs->update($this);
    }
  }
  /**
   * @author jichao.wang
   * 执行登陆
   */
  function handleLogin()
  {
    $ip = rand(1,100);
    switch (rand(1, 3)) {
      case 1:
        $this->setStatus(self::LOGIN_ACCESS, $ip);
        $ret = true;
        break;
      case 2:
        $this->setStatus(self::LOGIN_WRONG_PASS, $ip);
        $ret = false;
        break;
      case 3:
        $this->setStatus(self::LOGIN_USER_UNKNOWN, $ip);
        $ret = false;
        break;
    }
    /**
     * handle event
     */
    $this->notify();
    return $ret;
  }
  /**
   * @param $status
   * @author jichao.wang
   * set login status
   */
  function setStatus($status,$ip)
  {
    $this->status = $status;
    $this->ip = $ip;
  }
  /**
   * @return mixed
   * @author jichao.wang
   * get login status
   */
  function getStatus()
  {
    return $this->status;
  }
}
/**
 * 只针对登陆的贯观察者
 * Class LoginObserver
 */
abstract class LoginObserver implements SplObserver {
  private $login;
  function __construct(Login $login){
    $this->login = $login;
    $login->attach($this);
  }
  /**
   * 对外统一的访问点
   * @param SplSubject $subject
   */
  function update( SplSubject $subject ){
    if($subject === $this->login){
      $this->doUpdate($subject);
    }
  }
  abstract function doUpdate( Login $login );
}
/**
 * Class EmailObserver
 */
class EmailObserver extends LoginObserver{
  //不同功能的观察者实现不同的功能
  function doUpdate( Login $login ){
    $status = $login->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
      echo __CLASS__.'用户ip:'.$login->ip.'登陆成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
      echo __CLASS__.'用户ip:'.$login->ip.'登陆失败,密码错误!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
      echo __CLASS__.'用户ip:'.$login->ip.'登陆失败,无此用户!'.'------------------';
    }
  }
}
//实例化登陆信息
$login = new Login();
//实现发邮件观察者
new EmailObserver($login);
//开始登陆
$login->handleLogin();

运行结果:

EmailObserver用户ip:77登陆成功!------------------

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

PHP 相关文章推荐
一个简单的自动发送邮件系统(三)
Oct 09 PHP
php自动适应范围的分页代码
Aug 05 PHP
PHP教程 预定义变量
Oct 23 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
Jan 17 PHP
获取URL文件名后缀
Oct 24 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
PHP性能分析工具XHProf安装使用教程
May 13 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
PHP正则获取页面所有图片地址
Mar 23 PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
PHP文件下载实例代码浅析
Aug 17 PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 #PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 #PHP
PHP一致性hash分布式算法封装类定义与用法示例
Aug 04 #PHP
PHP实现的函数重载功能示例
Aug 03 #PHP
thinkPHP5框架导出Excel文件简单操作示例
Aug 03 #PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 #PHP
PHP后台实现微信小程序登录
Aug 03 #PHP
You might like
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
小程序实现列表倒计时功能
2021/01/29 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
Python模仿POST提交HTTP数据及使用Cookie值的方法
2014/11/10 Python
python中使用序列的方法
2015/08/03 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
Python实现元素等待代码实例
2019/11/11 Python
基于python图像处理API的使用示例
2020/04/03 Python
pandas DataFrame运算的实现
2020/06/14 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
Servlet面试题库
2015/07/18 面试题
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
小学生操行评语大全
2014/04/22 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
单身申明具结书
2015/02/26 职场文书
抢劫罪辩护词
2015/05/21 职场文书