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 22 PHP
php smarty模版引擎中的缓存应用
Dec 02 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
PHP中的cookie不用刷新就生效的方法
Feb 04 PHP
php CI框架插入一条或多条sql记录示例
Jul 29 PHP
php自定义apk安装包实例
Oct 20 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
php检测文本的编码
Jul 26 PHP
php封装的连接Mysql类及用法分析
Dec 10 PHP
php libevent 功能与使用方法详解
Mar 04 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
简单的PHP缓存设计实现代码
2011/09/30 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
JS Timing
2007/04/21 Javascript
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
对python Tkinter Text的用法详解
2018/10/11 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
纽约手袋品牌:KARA
2018/03/18 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
毕业生实习鉴定
2013/12/11 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
高中校园广播稿
2014/10/21 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
MySQL GRANT用户授权的实现
2021/06/18 MySQL