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和ACCESS写聊天室(七)
Oct 09 PHP
一个简洁的多级别论坛
Oct 09 PHP
nginx+php-fpm配置文件的组织结构介绍
Nov 07 PHP
php中的比较运算符详解
Oct 28 PHP
destoon供应信息title调用出公司名称的方法
Aug 22 PHP
thinkphp中html:list标签传递多个参数实例
Oct 30 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
php中 $$str 中 &quot;$$&quot; 的详解
Jul 06 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
laravel框架语言包拓展实现方法分析
Nov 22 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 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/05/20 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
2010/06/07 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
angular2使用简单介绍
2016/03/01 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
推荐11个实用Python库
2015/01/23 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
行政经理的岗位职责
2013/11/23 职场文书
优秀会计求职信
2014/07/04 职场文书
新员工入职欢迎词
2015/01/23 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
国庆放假通知怎么写
2015/07/30 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
使用Ajax实现进度条的绘制
2022/04/07 Javascript