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 删除记录同时删除图片文件的实现代码
May 12 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
php获取从百度搜索进入网站的关键词的详细代码
Jan 08 PHP
thinkphp的c方法使用示例
Feb 24 PHP
php+js实现异步图片上传实例分享
Jun 02 PHP
php简单实现快速排序的方法
Apr 04 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
php验证码生成代码
Nov 11 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
Jan 05 PHP
php文件管理基本功能简单操作
Jan 16 PHP
Yii2 中实现单点登录的方法
Mar 09 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维护文件系统
2006/10/09 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
2011/05/04 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
JavaScript中Function详解
2015/02/27 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
Python的Django框架中settings文件的部署建议
2015/05/30 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
python Xpath语法的使用
2020/11/26 Python
Python实现微信表情包炸群功能
2021/01/28 Python
Django如何重置migration的几种情景
2021/02/24 Python
教师应聘个人求职信
2013/12/10 职场文书
会计职业生涯规划范文
2014/01/04 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
教师一帮一活动总结
2014/07/08 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
四则混合运算教学反思
2016/02/23 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL