PHP设计模式之观察者模式定义与用法示例


Posted in PHP onAugust 04, 2018

本文实例讲述了PHP设计模式之观察者模式定义与用法。分享给大家供大家参考,具体如下:

<?php
/**
 * Interface Observable
 * define a observable interface
 * @author jichao.wang
 */
interface Observable
{
  function attach(Observer $observer);
  function detach(Observer $observer);
  function notify();
}
/**
 * Class Login
 * @author jichao.wang
 */
class Login implements Observable
{
  private $observers;
  public $status;
  public $ip;
  const LOGIN_ACCESS = 1;
  const LOGIN_WRONG_PASS = 2;
  const LOGIN_USER_UNKNOWN = 3;
  function __construct()
  {
    $this->observers = array();
  }
  /**
   * @param Observer $observer
   * @author jichao.wang
   * attach a observer
   */
  function attach(Observer $observer)
  {
    $this->observers[] = $observer;
  }
  /**
   * @param Observer $observer
   * @author jichao.wang
   * detach a observer
   */
  function detach(Observer $observer)
  {
    $newObservers = array();
    foreach ($this->observers as $key => $obs) {
      if ($obs !== $observer) {
        $newObservers[] = $obs;
      }
    }
    $this->observers = $newObservers;
  }
  /**
   * @author jichao.wang
   * handle observer notify
   */
  function notify()
  {
    foreach ($this->observers 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;
  }
}
/**
 * Interface Observer
 * @author jichao.wang
 */
interface Observer {
  function update(Observable $observable);
}
/**
 * Class EmailObserver
 * @author jichao.wang
 */
class EmailObserver implements Observer {
  function update (Observable $observable) {
    $status = $observable->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,密码错误!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,无此用户!'.'------------------';
    }
  }
}
/**
 * Class PhoneObserver
 * @author jichao.wang
 */
class PhoneObserver implements Observer {
  function update (Observable $observable) {
    $status = $observable->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,密码错误!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,无此用户!'.'------------------';
    }
  }
}
class AbcObserver implements Observer {
  function update (Observable $observable) {
    $status = $observable->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,密码错误!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,无此用户!'.'------------------';
    }
  }
}
//实例化登陆信息
$login = new Login();
//实现发邮件观察者
$login->attach(new EmailObserver());
//实现发验证码观察者
$login->attach(new PhoneObserver());
//实现其他观察者
$login->attach(new AbcObserver());
//开始登陆
$login->handleLogin();
?>

运行结果:

EmailObserver用户ip:41登陆失败,无此用户!------------------PhoneObserver用户ip:41登陆失败,无此用户!------------------AbcObserver用户ip:41登陆失败,无此用户!------------------

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP XML备份Mysql数据库
May 27 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
基于Windows下Apache PHP5.3.1安装教程
Jan 08 PHP
php垃圾代码优化操作代码
Aug 05 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
php使用sql数据库 获取字段问题介绍
Aug 12 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
Sep 22 PHP
php使用PDO方法详解
Dec 27 PHP
php header函数的常用http头设置
Jun 25 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
PHP入门教程之操作符与控制结构流程详解
Sep 09 PHP
解决laravel查询构造器中的别名问题
Oct 17 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
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 #PHP
You might like
PHP实现图片压缩的两则实例
2014/07/19 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
php无限极分类实现方法分析
2019/07/04 PHP
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
关于JSON与JSONP简单总结
2016/08/16 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
python中的字典使用分享
2016/07/31 Python
Python实现定时任务
2017/02/08 Python
python实现ID3决策树算法
2017/12/20 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
学python爬虫能做什么
2020/07/29 Python
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
商务助理求职信范文
2014/04/20 职场文书
2014应届本科生自我评价
2014/09/13 职场文书