php教程

超轻量级php框架startmvc

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

更新时间:2020-03-29 10:55:41 作者:startmvc
本文实例讲述了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 设计模式 观察者模式