php记录者模式
原创观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。
一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码,而观察者模式实现了低耦合,非侵入式的通知与更新机制
要用到注册树模式中的注册功能,把观察者对象注册到事件类的成员变量中去。
interface Observable
{
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
<?php
class Login implements Observable
{
private $observers;
public $status;
public $ip;
const LOGIN_ACCESS = 1;
const LOGIN_WRONG_PASS = 2;
const LOGIN_USER_UNKNOWN = 3;
public function __construct()
{
$this->observers = array();
}
/**
- @param Observer $observer
- attach a observer
*/
public function attach(Observer $observer)
{
$this->observers[] = $observer;
}
/**
- @param Observer $observer
- detach a observer
*/
public function detach(Observer $observer)
{
$newObservers = array();
foreach ($this->observers as $key => $obs) {
if ($obs !== $observer) {
$newObservers[] = $obs;
}
}
$this->observers = $newObservers;
}
/**
- handle observer notify
*/
public function notify()
{
foreach ($this->observers as $obs) {
$obs->update($this);
}
}
/**
- 执行登陆
*/
public 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
- set login status
*/
public function setStatus($status,$ip)
{
$this->status = $status;
$this->ip = $ip;
}
/**
- @return mixed
- get login status
*/
public function getStatus()
{
return $this->status;
}
}
interface Observer {
public function update(Observable $observable);
}
class EmailObserver implements Observer {
public 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
*/
class PhoneObserver implements Observer {
public 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 OtherObserver implements Observer {
public 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 OtherObserver());
//开始登录
$login->handleLogin();
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除