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中的实现trim函数代码
Mar 19 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
Jun 21 PHP
php读取EXCEL文件 php excelreader读取excel文件
Dec 06 PHP
php数组键名技巧小结
Feb 17 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
简介PHP的Yii框架中缓存的一些高级用法
Mar 29 PHP
php实现的一段简单概率相关代码
May 30 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
PHP信号处理机制的操作代码讲解
Apr 19 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
Dec 02 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去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
从PHP的源码中深入了解stdClass类
2014/04/18 PHP
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
JavaScript弹出窗口方法汇总
2014/08/12 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
VUE动态生成word的实现
2020/07/26 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
python实现多线程抓取知乎用户
2016/12/12 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
Python3匿名函数用法示例
2018/07/25 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
毕业酒会致辞
2015/07/29 职场文书
卫生主题班会
2015/08/14 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
电工生产实习心得体会
2016/01/22 职场文书
新课程改革心得体会
2016/01/22 职场文书
HTML+CSS制作心跳特效的实现
2021/05/26 HTML / CSS
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android