<?php
/**
 * 【观察者模式】
 * PHP5中提供了 观察者(observer) 和 被观察者(subject) 的接口
 * 在手册搜索:SplSubject (PHP 5 >= 5.1.0)
 *
 * SplSubject  {
 *         abstract public void attach ( SplObserver $observer )
 *         abstract public void detach ( SplObserver $observer )
 *         abstract public void notify ( void )
 * }
 *
 */

header("Content-type: text/html; charset=utf-8");

/*根据登录次数和爱好,进行观察.定义user类,实现SplSubject接口 */
class User implements SplSubject{
    public $lognum; //登录次数
    public $hobby; //爱好
    protected $observers; //用来储存对象

    public function __construct($hobby){
        $this->lognum = rand(1,10); //登录次数:随机数
        $this->hobby = $hobby; //爱好:参数传递
        $this->observers = new SplObjectStorage();
    }

    //登录操作
    public function login(){
        //操作session... 代码忽略
        //登录后,触发notify
        $this->notify();
    }

    //观察
    public function attach(SPLObserver $observer){
        $this->observers->attach($observer);
    }

    //取消观察
    public function detach(SPLObserver $observer){
        $this->observers->detach($observer);
    }

    //通知
    public function notify(){
        $this->observers->rewind();
        //不断循环获取储存的对象
        while($this->observers->valid()){
            $observer = $this->observers->current();
            $observer->update($this);
            $this->observers->next();
        }
    }

}

/*假如现在有个“安全模块” security 要来观察 */
class security implements SPLObserver{
    public function update(SplSubject $subject){
        if($subject->lognum < 3){
            echo '这是第'.$subject->lognum.'次安全登录<br>';
        }else{
            echo '这是第'.$subject->lognum.'次登录,出现异常。<br>';
        }
    }
}

/*再假如现在有个“广告模块” ad 要来观察 */
class ad implements SPLObserver{
    public function update(SplSubject $subject){
        if($subject->hobby == 'sports'){
            echo '开运动会<br>';
        }else{
            echo '哈哈哈哈哈哈<br>';
        }
    }
}

/*实施观察*/
//实例化User
$user = new User('sports');
//实施“安全模块”的观察
$user->attach(new security());
//实施“广告模块”的观察
$user->attach(new ad());
//执行登录操作
$user->login();

最新文章

  1. IIS 连接 oracle报Oracle.DataAccess版本错误解决办法
  2. 如何让tableViewCell的分割线从边框顶端开始
  3. 【BZOJ】3994: [SDOI2015]约数个数和
  4. python对象
  5. 织梦建站:视频弹出播放JS+CSS
  6. int 和 string 相互转换(简洁版)
  7. flow.ci Beta 上线,将开发工作流自动化
  8. Java_Class 16方格拼图游戏
  9. Android不规则点击区域详解
  10. page cache和buffer cache 图解
  11. C# IO操作磁盘上的txt
  12. CodeBlocks13.12汉化以及去掉注释及字符串的下划线
  13. [LeetCode]题解(python):010-Regular Expression Matching
  14. Hibernate 系列教程2-创建maven工程
  15. 解决ubuntu不能安装g++的问题
  16. svg-写一个简单的进度条
  17. linux性能调试之vmstat
  18. vuetify
  19. No identifier specified for entity: springboot-jpa报错No identifier specified for entity
  20. was cached in the local repository, resolution will not be reattempted until the update interval of localhost-repository has elapsed or updates are forced

热门文章

  1. Visual Studio 2013发布网站
  2. django url 软编码
  3. NSData
  4. Reporting services导出的Excel文件避免出现隐藏行列的布局
  5. hunnu 修路
  6. Aptana Studio3开发Python和Ruby(最佳工具)
  7. JavaScript: basis
  8. JSon_零基础_004_将Set集合对象转换为JSon格式的对象字符串,返回给界面
  9. spark history-server的使用
  10. drds 分库表的创建速记