例如在登录时,需要判断用户是第几次登录,登录过于频繁我们就给用户提示异常。根据用户的爱好,在用户登录后给予相应的猜你喜欢。如果都在 登录时判断密码的方法内完成,不符合面向对对象的单一职责。那我们该怎么完成呢?

    php 在 5.1 之后有自带的 --> 观察者 observer 和 被观察者 subject 接口。

    观察者模式分为观察者、与被观察者。观察者时刻监听被观察动态,及时做出相应改变。

直接上代码:

<?php
    header("content-type:text/html;charset=utf8");
    //实现被观察者接口。
    class usr implements SplSubject{
        public $lognum;
        public $hobby;
        protected $observers=null;

        public function login(){
            //检测操作
            //session 操作
            $this->notify();
        }    

        public function __construct($hobby){
            $this->lognum=rand(1,12);
            $this->hobby=$hobby;
            $this->observers=new SplObjectStorage();
        }
        //添加观察者对象。
        public function attach(SPLObserver $observer){
            $this->observers->attach($observer);
        }
        //删除观察者对象。
        public function detach(SPLObserver $observer){
            $this->observers->detach($observer);
        }
        //触发观察者的改变事件。
        public function notify(){
            //重置观察者队列。
            $this->observers->rewind();
            //将观察者从队列一个一个取出。
            //valid 是检测是否还存在观察者。
            while($this->observers->valid()){
                //取出当前观察者。
                $observer=$this->observers->current();
                //触发观察者改变事件(将被观察者对象传递过去)。
                $observer->update($this);
                //将队列指针移动向下一位。
                $this->observers->next();
            }
        }
    }
    //观察者判断被观察者改变。
    class Login implements SPLObserver{
        public function update(SplSubject $subject){
            //判断所观察属性的改变。
            if($subject->lognum < 3){
                echo '这是第'.$subject->lognum."次安全登陆。"."<br>";
            }else{
                echo '这是第'.$subject->lognum."次登陆,异常"."<br>";
            }
        }
    }
    //观察者判断被观察者改变。
    class Hobby implements SplObserver{
        public function update(SplSubject $subject){
            //判断所观察属性的改变。
            if($subject->hobby=="sports"){
                echo '健身是身体健康的最佳捷径。';
            }else{
                echo"热爱生活!!!";
            }
        }
     }

    //实施观察。
    $use= new usr("sports");
    $use->attach(new Login());
    $use->attach(new Hobby());
    $use->login();
?>

最新文章

  1. Coretext实现图文混排及Gif图片播放
  2. paper 47 :Latex中文显示(转)
  3. 转__Android Studio ,基于intellij idea
  4. N皇后//搜索入门
  5. Java读写Windows共享文件夹 .
  6. Spring Boot 基础
  7. [51nod1310]Chandrima and XOR
  8. mysql-SQL Error: 1205, SQLState: 41000
  9. git push 远程新分支
  10. 【vim】实时计算器
  11. git初始化项目 以及 git常用操作
  12. java.lang.UnsupportedClassVersionError: org/kie/api/KieServices$Factory : Unsupported major.minor version 52.0
  13. python写的读取json配置文件
  14. js中的php rand函数
  15. android获取对话框文本注意事项
  16. java读properties文件 乱码
  17. 使用ntp协议同步本地时间(C语言)
  18. 你的UI设计够不够趣味性
  19. csu 1965
  20. Luogu2737 USACO4.1麦香牛块(动态规划)

热门文章

  1. 解读HDFS(转载)
  2. hdoj--2180--时钟(数学)
  3. (五)api网关服务 zuul-路由
  4. BZOJ 2179 FFT模板
  5. SPSS学习小记
  6. excel文件使用html导出
  7. 解决局域网内无法IP访问IIS已发布的网站
  8. javascipt入门
  9. ActiveMQ学习笔记(15)----Message Dispatch高级特性(一)
  10. Android Studio 开发安卓软件时下载的工程项目 Sync with gradle 失败