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简单静态页生成过程
Mar 27 PHP
GBK的页面输出JSON格式的php函数
Feb 16 PHP
php短域名转换为实际域名函数
Jan 17 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
PHP使用feof()函数读文件的方法
Nov 07 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
PHP常用的小程序代码段
Nov 14 PHP
php多线程并发实现方法
Sep 30 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
PHP基于swoole多进程操作示例
Aug 12 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
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
简单的js计算器实现
2016/10/26 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
Python中实现常量(Const)功能
2015/01/28 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
Python实现图片添加文字
2019/11/26 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
scrapy头部修改的方法详解
2020/12/06 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
悦木之源美国官网:Origins美国
2016/08/01 全球购物
妇女儿童发展规划实施方案
2014/03/16 职场文书
升旗仪式主持词
2014/03/19 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
九寨沟导游词
2015/02/02 职场文书
小学主题班会教案
2015/08/17 职场文书
求职信如何撰写?
2019/05/22 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP
微信小程序调用python模型
2022/04/21 Python