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 相关文章推荐
PHP strtok()函数的优点分析
Mar 02 PHP
php下统计用户在线时间的一种尝试
Aug 26 PHP
第三章 php操作符与控制结构代码
Dec 30 PHP
php统计文章排行示例
Mar 04 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
May 05 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
PHP操作MySQL事务实例
Nov 05 PHP
php创建多级目录的方法
Mar 24 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
PHP微信开发用Cache 解决数据缓存
Jul 11 PHP
Zend Framework路由器用法实例详解
Dec 11 PHP
laravel实现上传图片的两种方式小结
Oct 12 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实现图片上传并进行替换操作
2016/03/15 PHP
PHP+JQuery+Ajax实现分页方法详解
2016/08/06 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
Python探索之Metaclass初步了解
2017/10/28 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
Python同步遍历多个列表的示例
2019/02/19 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
医学生职业规划范文
2014/01/05 职场文书
一份报关员的职业规划范文
2014/01/08 职场文书
镇创先争优活动总结
2014/08/28 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
礼仪培训心得体会
2016/01/22 职场文书
python 爬取华为应用市场评论
2021/05/29 Python
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
java多态注意项小结
2021/10/16 Java/Android