一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP設計模式之觀察者模式定義與用法示例

PHP設計模式之觀察者模式定義與用法示例

2019-09-16 16:20coder_up PHP教程

這篇文章主要介紹了PHP設計模式之觀察者模式定義與用法,結合實例形式分析了php觀察者模式的具體定義及相關使用操作技巧,需要的朋友可以參考下

本文實例講述了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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 香蕉久久一区二区三区啪啪 | 国产精品麻豆 | 亚久久伊人精品青青草原2020 | 奇米影视久久 | 香蕉91| 欧美性一区二区三区 | 免费黄色网站视频 | 国产馆| 久久亚洲国产成人影院 | 久久亚洲高清观看 | 俄罗斯年轻男同gay69 | 草莓香蕉榴莲丝瓜秋葵绿巨人在线看 | 四虎网址大全 | 91精品国产色综合久久不卡蜜 | 免费毛片 | 欧洲vodafonewi精品 | 亚洲另类老妇videos | 男人天堂国产 | 极品美女写真菠萝蜜视频 | 午夜精品国产 | 9420高清完整版在线观看国语 | 学生小泬无遮挡女HD | 午夜AV亚洲一码二中文字幕青青 | 国产福利在线观看永久视频 | 日本在线www | 男模chinesegayxxxx | 国产肥臀 | 秋霞鲁丝影院久久人人综合 | 恩爱夫妇交换小说 | 免费看60分钟大片视频播放 | 国产精品视频第一区二区三区 | 成人免费观看www视频 | 日日免费视频 | 日本艳鉧动漫1~6在线观看 | 精品在线播放 | 男人狂擦女人的下面视频 | 国产一卡二卡3卡4卡四卡在线视频 | 欧美日韩国产一区二区三区伦 | 4444亚洲国产成人精品 | 丝瓜视频黄色在线观看 | 男女交性特一级 |