使用php標準庫spl在實現觀察者模式

來源:互聯網
上載者:User
上次使用了純php實現了一個觀察者模式(php觀察者模式), 現在使用php標準庫spl在次實現觀察者模式,好處是:隨意的產生您想使用的觀察者!

storage = new SplObjectStorage();    }    function attach (SplObserver $observer) {        $this->storage->attach($observer);    }    function detach(SplObserver $observer){        $this->storage->detach($observer);    }    function notify(){        foreach ($this->storage 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;    }}/** * 只針對登陸的貫觀察者 * Class LoginObserver */abstract class LoginObserver implements SplObserver {    private $login;    function __construct(Login $login){        $this->login = $login;        $login->attach($this);    }    /**     * 對外統一的訪問點     * @param SplSubject $subject     */    function update( SplSubject $subject ){        if($subject === $this->login){            $this->doUpdate($subject);        }    }    abstract function doUpdate( Login $login );}/** * Class EmailObserver */class EmailObserver extends LoginObserver{    //不同功能的觀察者實現不同的功能    function doUpdate( Login $login ){        $status = $login->getStatus();        if($status == Login::LOGIN_ACCESS){//            $this->sendMail('使用者ip:'.$observable->ip.'登陸成功!');            echo __CLASS__.'使用者ip:'.$login->ip.'登陸成功!'.'------------------';        }        if($status == Login::LOGIN_WRONG_PASS){//            $this->sendMail('使用者ip:'.$observable->ip.'登陸失敗,密碼錯誤!');            echo __CLASS__.'使用者ip:'.$login->ip.'登陸失敗,密碼錯誤!'.'------------------';        }        if($status == Login::LOGIN_USER_UNKNOWN){//            $this->sendMail('使用者ip:'.$observable->ip.'登陸失敗,無此使用者!');            echo __CLASS__.'使用者ip:'.$login->ip.'登陸失敗,無此使用者!'.'------------------';        }    }}//執行個體化登陸資訊$login = new Login();//實現發郵件觀察者new EmailObserver($login);//開始登陸$login->handleLogin();
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.