• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • PHP设计模式之观察者模式(Observer)详细介绍和代码实例
    • php设计模式 Observer(观察者模式)
    • PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
    • PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解
    • PHP设计模式之迭代器(Iterator)模式入门与应用详解
    • PHP设计模式之解释器(Interpreter)模式入门与应用详解
    • PHP设计模式之工厂模式(Factory)入门与应用详解
    • php设计模式之适配器模式原理、用法及注意事项详解
    • php设计模式 Template (模板模式)
    • php设计模式 Proxy (代理模式)
    • PHP常用的三种设计模式汇总
    • PHP设计模式之观察者模式入门与应用案例详解
    上一篇:PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
    下一篇:PHP使用标准库spl实现的观察者模式示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP设计模式之观察者模式定义与用法示例 PHP,设计模式,之,观察者,