主頁(yè) > 知識(shí)庫(kù) > PHP設(shè)計(jì)模式之觀察者模式定義與用法示例

PHP設(shè)計(jì)模式之觀察者模式定義與用法示例

熱門(mén)標(biāo)簽:團(tuán)購(gòu)網(wǎng)站 阿里云 電子圍欄 服務(wù)器配置 Linux服務(wù)器 銀行業(yè)務(wù) 科大訊飛語(yǔ)音識(shí)別系統(tǒng) Mysql連接數(shù)設(shè)置

本文實(shí)例講述了PHP設(shè)計(jì)模式之觀察者模式定義與用法。分享給大家供大家參考,具體如下:

?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
   * 執(zhí)行登陸
   */
  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.'登陸失敗,密碼錯(cuò)誤!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無(wú)此用戶!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無(wú)此用戶!'.'------------------';
    }
  }
}
/**
 * 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.'登陸失敗,密碼錯(cuò)誤!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無(wú)此用戶!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無(wú)此用戶!'.'------------------';
    }
  }
}
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.'登陸失敗,密碼錯(cuò)誤!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,密碼錯(cuò)誤!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用戶ip:'.$observable->ip.'登陸失敗,無(wú)此用戶!');
      echo __CLASS__.'用戶ip:'.$observable->ip.'登陸失敗,無(wú)此用戶!'.'------------------';
    }
  }
}
//實(shí)例化登陸信息
$login = new Login();
//實(shí)現(xiàn)發(fā)郵件觀察者
$login->attach(new EmailObserver());
//實(shí)現(xiàn)發(fā)驗(yàn)證碼觀察者
$login->attach(new PhoneObserver());
//實(shí)現(xiàn)其他觀察者
$login->attach(new AbcObserver());
//開(kāi)始登陸
$login->handleLogin();
?>

運(yùn)行結(jié)果:

EmailObserver用戶ip:41登陸失敗,無(wú)此用戶!------------------PhoneObserver用戶ip:41登陸失敗,無(wú)此用戶!------------------AbcObserver用戶ip:41登陸失敗,無(wú)此用戶!------------------

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP設(shè)計(jì)模式之觀察者模式(Observer)詳細(xì)介紹和代碼實(shí)例
  • php設(shè)計(jì)模式 Observer(觀察者模式)
  • PHP中常用的三種設(shè)計(jì)模式詳解【單例模式、工廠模式、觀察者模式】
  • PHP設(shè)計(jì)模式之中介者模式(Mediator Pattern)入門(mén)與應(yīng)用案例詳解
  • PHP設(shè)計(jì)模式之迭代器(Iterator)模式入門(mén)與應(yīng)用詳解
  • PHP設(shè)計(jì)模式之解釋器(Interpreter)模式入門(mén)與應(yīng)用詳解
  • PHP設(shè)計(jì)模式之工廠模式(Factory)入門(mén)與應(yīng)用詳解
  • php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解
  • php設(shè)計(jì)模式 Template (模板模式)
  • php設(shè)計(jì)模式 Proxy (代理模式)
  • PHP常用的三種設(shè)計(jì)模式匯總
  • PHP設(shè)計(jì)模式之觀察者模式入門(mén)與應(yīng)用案例詳解

標(biāo)簽:萍鄉(xiāng) 廣元 衡水 大理 江蘇 衢州 蚌埠 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP設(shè)計(jì)模式之觀察者模式定義與用法示例》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266