Heim  >  Artikel  >  Backend-Entwicklung  >  php设计模式之观察者模式_PHP教程

php设计模式之观察者模式_PHP教程

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

php设计模式之观察者模式

<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设计模式之观察者模式 /** * Interface Observable * define a observable interface * @author jichao.wang */interface Observable{ function attach(Observer $observer); func...
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn