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读取目录下所有文件的代码
Jan 07 PHP
php下关于中英数字混排的字符串分割问题
Apr 06 PHP
PHP JSON 数据解析代码
May 26 PHP
比较详细PHP生成静态页面教程
Jan 10 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
php遍历CSV类实例
Apr 14 PHP
php实现中文字符截取防乱码方法汇总
Apr 29 PHP
php中让人头疼的浮点数运算分析
Oct 10 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
详解使用php-cs-fixer格式化代码
Sep 16 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文本转图片自动换行的方法
2013/03/13 PHP
解析PHP可变函数的经典用法
2013/06/20 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
php数组使用规则分析
2015/02/27 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
浅析vue中常见循环遍历指令的使用 v-for
2018/04/18 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
生态学毕业生自荐信
2013/10/27 职场文书
思想专业自荐信范文
2013/12/25 职场文书
外贸英语专业求职信范文
2013/12/25 职场文书
领导视察欢迎词
2014/01/15 职场文书
转让协议书范本
2014/04/15 职场文书
根叔历年演讲稿
2014/05/20 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
实习单位鉴定意见
2015/06/04 职场文书
总结会主持词
2015/07/02 职场文书
mysql的Buffer Pool存储及原理
2022/04/02 MySQL
python实现双向链表原理
2022/05/25 Python