请选择 进入手机版 | 继续访问电脑版
绿茶科技社区
这篇文章主要介绍了PHP设计模式之观察者模式定义与用法,结合实例形式分析了php观察者模式的具体定义及相关使用操作技巧,需要的朋友可以参考下
本文实例讲述了PHP设计模式之观察者模式定义与用法。分享给大家供大家参考,具体如下:
  1. <?php
  2. /**
  3. * Interface Observable
  4. * define a observable interface
  5. * @author jichao.wang
  6. */
  7. interface Observable
  8. {
  9.   function attach(Observer $observer);
  10.   function detach(Observer $observer);
  11.   function notify();
  12. }
  13. /**
  14. * Class Login
  15. * @author jichao.wang
  16. */
  17. class Login implements Observable
  18. {
  19.   private $observers;
  20.   public $status;
  21.   public $ip;
  22.   const LOGIN_ACCESS = 1;
  23.   const LOGIN_WRONG_PASS = 2;
  24.   const LOGIN_USER_UNKNOWN = 3;
  25.   function __construct()
  26.   {
  27.     $this->observers = array();
  28.   }
  29.   /**
  30.    * @param Observer $observer
  31.    * @author jichao.wang
  32.    * attach a observer
  33.    */
  34.   function attach(Observer $observer)
  35.   {
  36.     $this->observers[] = $observer;
  37.   }
  38.   /**
  39.    * @param Observer $observer
  40.    * @author jichao.wang
  41.    * detach a observer
  42.    */
  43.   function detach(Observer $observer)
  44.   {
  45.     $newObservers = array();
  46.     foreach ($this->observers as $key => $obs) {
  47.       if ($obs !== $observer) {
  48.         $newObservers[] = $obs;
  49.       }
  50.     }
  51.     $this->observers = $newObservers;
  52.   }
  53.   /**
  54.    * @author jichao.wang
  55.    * handle observer notify
  56.    */
  57.   function notify()
  58.   {
  59.     foreach ($this->observers as $obs) {
  60.       $obs->update($this);
  61.     }
  62.   }
  63.   /**
  64.    * @author jichao.wang
  65.    * 执行登陆
  66.    */
  67.   function handleLogin()
  68.   {
  69.     $ip = rand(1,100);
  70.     switch (rand(1, 3)) {
  71.       case 1:
  72.         $this->setStatus(self::LOGIN_ACCESS, $ip);
  73.         $ret = true;
  74.         break;
  75.       case 2:
  76.         $this->setStatus(self::LOGIN_WRONG_PASS, $ip);
  77.         $ret = false;
  78.         break;
  79.       case 3:
  80.         $this->setStatus(self::LOGIN_USER_UNKNOWN, $ip);
  81.         $ret = false;
  82.         break;
  83.     }
  84.     /**
  85.      * handle event
  86.      */
  87.     $this->notify();
  88.     return $ret;
  89.   }
  90.   /**
  91.    * @param $status
  92.    * @author jichao.wang
  93.    * set login status
  94.    */
  95.   function setStatus($status,$ip)
  96.   {
  97.     $this->status = $status;
  98.     $this->ip = $ip;
  99.   }
  100.   /**
  101.    * @return mixed
  102.    * @author jichao.wang
  103.    * get login status
  104.    */
  105.   function getStatus()
  106.   {
  107.     return $this->status;
  108.   }
  109. }
  110. /**
  111. * Interface Observer
  112. * @author jichao.wang
  113. */
  114. interface Observer {
  115.   function update(Observable $observable);
  116. }
  117. /**
  118. * Class EmailObserver
  119. * @author jichao.wang
  120. */
  121. class EmailObserver implements Observer {
  122.   function update (Observable $observable) {
  123.     $status = $observable->getStatus();
  124.     if($status == Login::LOGIN_ACCESS){
  125. //      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
  126.       echo __CLASS__.'用户ip:'.$observable->ip.'登陆成功!'.'------------------';
  127.     }
  128.     if($status == Login::LOGIN_WRONG_PASS){
  129. //      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
  130.       echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,密码错误!'.'------------------';
  131.     }
  132.     if($status == Login::LOGIN_USER_UNKNOWN){
  133. //      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
  134.       echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,无此用户!'.'------------------';
  135.     }
  136.   }
  137. }
  138. /**
  139. * Class PhoneObserver
  140. * @author jichao.wang
  141. */
  142. class PhoneObserver implements Observer {
  143.   function update (Observable $observable) {
  144.     $status = $observable->getStatus();
  145.     if($status == Login::LOGIN_ACCESS){
  146. //      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
  147.       echo __CLASS__.'用户ip:'.$observable->ip.'登陆成功!'.'------------------';
  148.     }
  149.     if($status == Login::LOGIN_WRONG_PASS){
  150. //      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
  151.       echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,密码错误!'.'------------------';
  152.     }
  153.     if($status == Login::LOGIN_USER_UNKNOWN){
  154. //      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
  155.       echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,无此用户!'.'------------------';
  156.     }
  157.   }
  158. }
  159. class AbcObserver implements Observer {
  160.   function update (Observable $observable) {
  161.     $status = $observable->getStatus();
  162.     if($status == Login::LOGIN_ACCESS){
  163. //      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
  164.       echo __CLASS__.'用户ip:'.$observable->ip.'登陆成功!'.'------------------';
  165.     }
  166.     if($status == Login::LOGIN_WRONG_PASS){
  167. //      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
  168.       echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,密码错误!'.'------------------';
  169.     }
  170.     if($status == Login::LOGIN_USER_UNKNOWN){
  171. //      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
  172.       echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,无此用户!'.'------------------';
  173.     }
  174.   }
  175. }
  176. //实例化登陆信息
  177. $login = new Login();
  178. //实现发邮件观察者
  179. $login->attach(new EmailObserver());
  180. //实现发验证码观察者
  181. $login->attach(new PhoneObserver());
  182. //实现其他观察者
  183. $login->attach(new AbcObserver());
  184. //开始登陆
  185. $login->handleLogin();
  186. ?>
复制代码
运行结果:
  1. EmailObserver用户ip:41登陆失败,无此用户!------------------PhoneObserver用户ip:41登陆失败,无此用户!------------------AbcObserver用户ip:41登陆失败,无此用户!------------------
复制代码




分享到 :
0 人收藏

3 个回复

倒序浏览
冠军  金牌会员 | 2019-7-16 02:34:45
介是神马?!!
邀月  高级会员 | 2019-8-4 05:00:17
啊啊啊啊啊啊啊啊啊啊啊
wolfy  高级会员 | 2019-8-14 06:20:59
不错 支持一个了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

举报|Archiver|手机版|小黑屋|Lvchakeji Inc.  

Powered by Discuz! X3.3 © 2001-2016 Comsenz Inc.

返回顶部