Home  >  Article  >  Backend Development  >  PHP design pattern observer pattern_PHP tutorial

PHP design pattern observer pattern_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:11:05793browse

PHP Design Pattern Observer Pattern

<span style="font-family: Arial, Helvetica, sans-serif;"><?php</span>
/**
 * 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(&#39;用户ip:&#39;.$observable->ip.&#39;登陆成功!&#39;);
            echo __CLASS__.&#39;用户ip:&#39;.$observable->ip.&#39;登陆成功!&#39;.&#39;------------------&#39;;
        }
        if($status == Login::LOGIN_WRONG_PASS){
//            $this->sendMail(&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,密码错误!&#39;);
            echo __CLASS__.&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,密码错误!&#39;.&#39;------------------&#39;;
        }
        if($status == Login::LOGIN_USER_UNKNOWN){
//            $this->sendMail(&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,无此用户!&#39;);
            echo __CLASS__.&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,无此用户!&#39;.&#39;------------------&#39;;
        }
    }
}

/**
 * Class PhoneObserver
 * @author jichao.wang
 */
class PhoneObserver implements Observer {
    function update (Observable $observable) {
        $status = $observable->getStatus();
        if($status == Login::LOGIN_ACCESS){
//            $this->sendMail(&#39;用户ip:&#39;.$observable->ip.&#39;登陆成功!&#39;);
            echo __CLASS__.&#39;用户ip:&#39;.$observable->ip.&#39;登陆成功!&#39;.&#39;------------------&#39;;
        }
        if($status == Login::LOGIN_WRONG_PASS){
//            $this->sendMail(&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,密码错误!&#39;);
            echo __CLASS__.&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,密码错误!&#39;.&#39;------------------&#39;;
        }
        if($status == Login::LOGIN_USER_UNKNOWN){
//            $this->sendMail(&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,无此用户!&#39;);
            echo __CLASS__.&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,无此用户!&#39;.&#39;------------------&#39;;
        }
    }
}

class AbcObserver implements Observer {
    function update (Observable $observable) {
        $status = $observable->getStatus();
        if($status == Login::LOGIN_ACCESS){
//            $this->sendMail(&#39;用户ip:&#39;.$observable->ip.&#39;登陆成功!&#39;);
            echo __CLASS__.&#39;用户ip:&#39;.$observable->ip.&#39;登陆成功!&#39;.&#39;------------------&#39;;
        }
        if($status == Login::LOGIN_WRONG_PASS){
//            $this->sendMail(&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,密码错误!&#39;);
            echo __CLASS__.&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,密码错误!&#39;.&#39;------------------&#39;;
        }
        if($status == Login::LOGIN_USER_UNKNOWN){
//            $this->sendMail(&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,无此用户!&#39;);
            echo __CLASS__.&#39;用户ip:&#39;.$observable->ip.&#39;登陆失败,无此用户!&#39;.&#39;------------------&#39;;
        }
    }
}

//实例化登陆信息
$login = new Login();
//实现发邮件观察者
$login->attach(new EmailObserver());
//实现发验证码观察者
$login->attach(new PhoneObserver());
//实现其他观察者
$login->attach(new AbcObserver());
//开始登陆
$login->handleLogin();
?>

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/931647.htmlTechArticlephp design pattern observer pattern/*** Interface Observable * define a observable interface * @author jichao.wang*/interface Observable{ function attach(Observer $observer ); func...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn