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 相关文章推荐
PHP4之真OO
Oct 09 PHP
SSI指令
Nov 25 PHP
解决php中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
php去除字符串换行符示例分享
Feb 13 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
Jun 20 PHP
PHP压缩图片功能的介绍
Mar 21 PHP
Laravel数据库读写分离配置的方法
Oct 13 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 PHP
CI框架简单分页类用法示例
Jun 06 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
短波的认识
2021/03/01 无线电
php 图像函数大举例(非原创)
2009/06/20 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
PHP数组函数知识汇总
2016/05/12 PHP
显示、隐藏密码
2006/07/01 Javascript
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
Vue formData实现图片上传
2019/08/20 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
对python pandas 画移动平均线的方法详解
2018/11/28 Python
PHP统计代码行数的小代码
2019/09/19 Python
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
C语言50道问题
2014/10/23 面试题
幼儿运动会邀请函
2014/01/17 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
中学清明节活动总结
2014/07/04 职场文书
学校创先争优活动总结
2014/08/28 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS