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的ob_start();控制您的浏览器cache!
Feb 14 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
Aug 02 PHP
PHP获取MAC地址的函数代码
Sep 11 PHP
PHP 万年历实现代码
Oct 18 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
Apr 22 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
使用Composer安装Yii框架的方法
Mar 15 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 PHP
laravel使用数据库测试注意事项
Apr 10 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中cookie的作用域
2008/03/27 PHP
php 静态变量的初始化
2009/11/15 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
layui文件上传实现代码
2017/05/20 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
如何基于js判断浏览器版本
2020/02/20 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
python 自定义对象的打印方法
2019/01/12 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
请说出你所知道的线程同步的方法
2013/04/19 面试题
药学专业大专生的自我评价
2013/12/12 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
离职报告格式
2014/11/04 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
加班费申请报告
2015/05/15 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
如何利用python实现Simhash算法
2022/06/28 Python