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 相关文章推荐
实现dedecms全站URL静态化改造的代码
Mar 29 PHP
PHP 读取文件的正确方法
Apr 29 PHP
fleaphp常用方法分页之Pager使用方法
Apr 23 PHP
PHP sprintf()函数用例解析
May 18 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
php之curl设置超时实例
Nov 03 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
May 13 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
PHP socket 模拟POST 请求实例代码
Jul 18 PHP
php微信公众平台开发(四)回复功能开发
Dec 06 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
PHP创建自己的Composer包方法
Apr 09 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 常用类整理
2009/12/23 PHP
PHP数组实例总结与说明
2011/08/23 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
会自动逐行上升的文本框
2006/06/30 Javascript
一个符号插入器 中用到的js代码
2007/09/04 Javascript
jqPlot Option配置对象详解
2009/07/25 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
python检测远程udp端口是否打开的方法
2015/03/14 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
pyshp创建shp点文件的方法
2018/12/31 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
python反扒机制的5种解决方法
2021/02/06 Python
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
大学生个人总结的自我评价
2013/10/05 职场文书
小学数学课后反思
2014/04/23 职场文书
市场调查策划方案
2014/06/10 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
辞职信怎么写?
2019/05/21 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers