PHP 观察者模式的实现代码


Posted in PHP onMay 10, 2013

代码如下所示:

//被察者抽象类
class Observed implements SplSubject{
    protected $_name;
    protected $_observers;
    //实例化,生成一个观察者对象
    public function __construct(){
        $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(){
        foreach($this->_observers as $observer){
            $observer->showMessage($this);
        }
    }
    //普通方法: 设置值
    public function setName($name){
        $this->_name = $name;
        $this->notify();
    }
    //普通方法: 获取值
    public function getName(){
        return $this->_name;
    }
    //普通方法:设置年龄
    public function setAge($age){
        $this->age = $age;
        foreach($this->_observers as $observer){
            $observer->showAge($this->_name,$this->age);
        }
    }
}
// 观察者抽象类
class Observer implements SplObserver{
    //显示消息提示
    public function showMessage(SplSubject $obj){
        $user = $obj->getName();
        if($user==='admin'){
            echo '您好, ',$user,'欢迎您进入管理后台<br/>';
        }else{
            echo "你好, '$user' 你已经被添加到了用户列表<br/>";
        }
    }
    //这是继承父类的抽象方法
    public function update(SplSubject $subject) {}
    //显示个人年龄
    public function showAge($name,$age){
        echo "<script>alert('$name 的年龄是: $age')</script>";
    }
}
$subject = new Observed();  //生成一个被观察者对象
$observer = new Observer(); //生成一个观察者对象
$subject->attach($observer);//把观察者传入到被观察中去
$subject->setName('张三'); //调用 setName 方法
/*
 * 通过面的 setName 就会调用  $this->notify();
* 通过调用  $this->notify()就会调用 $observer->showMessage($this)方法,
* 即每个观察者对象的 showMessage($obj)方法;
*/
$subject->setName('admin');
$subject->setAge(24);
PHP 相关文章推荐
php Xdebug 调试扩展的安装与使用.
Mar 13 PHP
php 传值赋值与引用赋值的区别
Dec 29 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
codeigniter自带数据库类使用方法说明
Mar 25 PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 PHP
php判断当前用户已在别处登录的方法
Jan 06 PHP
PHP保存带BOM文件的方法
Feb 12 PHP
php实现在多维数组中查找特定value的方法
Jul 29 PHP
JavaScript实现删除电脑的关机键
Jul 26 PHP
PHP合并数组函数array_merge用法分析
Feb 17 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 #PHP
基于php实现长连接的方法与注意事项的问题
May 10 #PHP
Apache服务器无法使用的解决方法
May 08 #PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
May 08 #PHP
PHP 登录记住密码实现思路
May 07 #PHP
php启动时候提示PHP startup的解决方法
May 07 #PHP
深入phpMyAdmin的安装与配置的详细步骤
May 07 #PHP
You might like
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
php缓冲 output_buffering的使用详解
2013/06/13 PHP
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
解决vue 引入子组件报错的问题
2018/09/06 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
深入解析Python中的descriptor描述器的作用及用法
2016/06/27 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
JS原生实现轮播图的几种方法
2021/03/23 Javascript
大学生求职中的自我评价
2013/10/01 职场文书
出纳岗位职责
2013/11/09 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
《叶问2》观后感
2015/06/15 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS
Ajax实现三级联动效果
2021/10/05 Javascript
Nginx安装配置详解
2022/06/25 Servers