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速度全攻略
Oct 09 PHP
main.php
Dec 09 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
php检查是否是ajax请求的方法
Apr 16 PHP
PHP使用NuSOAP调用Web服务的方法
Jul 18 PHP
php微信开发之自定义菜单实现
Nov 18 PHP
php基于dom实现的图书xml格式数据示例
Feb 03 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
PHP与SQL语句写一句话木马总结
Oct 11 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/06/08 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
2019/09/02 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
vue实现信息管理系统
2020/05/30 Javascript
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
python飞机大战pygame游戏背景设计详解
2019/12/17 Python
Python安装whl文件过程图解
2020/02/18 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
为什么要有struct关键字
2012/05/08 面试题
linux面试题参考答案(6)
2014/08/29 面试题
生物专业个人自荐信范文
2013/11/29 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
无偿献血倡议书
2014/04/14 职场文书
工作说明书格式
2014/07/29 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书