php记录者模式

原创
小哥 3年前 (2022-11-17) 阅读数 40 #大杂烩

观察者模式(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();

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门