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实现WEB动态网页静态
Oct 09 PHP
PHP日期处理函数 整型日期格式
Jan 12 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
Feb 04 PHP
PHP魔术方法使用方法汇总
Feb 14 PHP
thinkPHP删除前弹出确认框的简单实现方法
May 16 PHP
PHP模糊查询的实现方法(推荐)
Sep 06 PHP
PHP中overload与override的区别
Feb 13 PHP
PHP如何读取由JavaScript设置的Cookie
Mar 22 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
Jul 17 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 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 OPCode缓存 APC详细介绍
2010/10/12 PHP
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
获取URL文件名后缀
2013/10/24 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
javascript每日必学之循环
2016/02/19 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
记录一次websocket封装的过程
2020/11/23 Javascript
Python实现的中国剩余定理算法示例
2017/08/05 Python
使用Python写一个小游戏
2018/04/02 Python
Flask框架钩子函数功能与用法分析
2019/08/02 Python
Django 自动生成api接口文档教程
2019/11/19 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
电气自动化专业职业规划范文
2014/02/16 职场文书
运动会口号大全
2014/06/07 职场文书
连锁超市项目计划书
2014/09/15 职场文书
业务员管理制度范本
2015/08/06 职场文书
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript