PHP设计模式之观察者模式定义与用法示例
php  /  管理员 发布于 3年前   373
本文实例讲述了PHP设计模式之观察者模式定义与用法。分享给大家供大家参考,具体如下: 运行结果: EmailObserver用户ip:41登陆失败,无此用户!------------------PhoneObserver用户ip:41登陆失败,无此用户!------------------AbcObserver用户ip:41登陆失败,无此用户!------------------ 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮助。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();?>
您可能感兴趣的文章:
原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..博主 在
科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 @ mashrdn 多切换几个节点测试,免费ssr是没那么稳..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号