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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
PHP调用三种数据库的方法(1)
Oct 09 PHP
BBS(php &amp; mysql)完整版(一)
Oct 09 PHP
解析PHP无限级分类方法及代码
Jun 21 PHP
PHP Class&amp;Object -- 解析PHP实现二叉树
Jun 25 PHP
CodeIgniter框架过滤HTML危险代码
Jun 12 PHP
PHP5.5和之前的版本empty函数的不同之处
Jun 13 PHP
Laravel 5 框架入门(三)
Apr 09 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
PHP查询附近的人及其距离的实现方法
May 11 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 PHP
php base64 编码与解码实例代码
Mar 21 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
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
用PHP 4.2书写安全的脚本
2006/10/09 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
php使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
PHP CURL使用详解
2019/03/21 PHP
分享20款好玩的jQuery游戏
2011/04/17 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
python实现同时给多个变量赋值的方法
2015/04/30 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
python aiohttp的使用详解
2019/06/20 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
tensorflow 查看梯度方式
2020/02/04 Python
使用python实现名片管理系统
2020/06/18 Python
Python内置函数property()如何使用
2020/09/01 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
英国探险旅游专家:Explore
2018/12/20 全球购物
会计专业大学生求职信范文
2014/01/28 职场文书
个人授权委托书样本
2014/09/13 职场文书
python用字节处理文件实例讲解
2021/04/13 Python
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
对Keras自带Loss Function的深入研究
2021/05/25 Python