知识屋:更实用的电脑技术知识网站
所在位置:首页 > 编程技术 > PHP编程

php设计模式之观察者模式

发布时间:2015-05-27 19:18:17作者:知识屋

/** * 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('用户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 * @author jichao.wang */class PhoneObserver implements Observer {    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 AbcObserver implements Observer {    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 AbcObserver());//开始登陆$login->handleLogin();?>

(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜