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性能优化 产生高度优化代码
Jul 22 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
Jun 25 PHP
php使用exec shell命令注入的方法讲解
Nov 12 PHP
PHP header()函数常用方法总结
Apr 11 PHP
phpstorm编辑器乱码问题解决
Dec 01 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
Zend Framework分页类用法详解
Mar 22 PHP
Yii2中DropDownList简单用法示例
Jul 18 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
PHP simplexml_import_dom()函数讲解
Feb 03 PHP
laravel 框架结合关联查询 when()用法分析
Nov 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
PHP中ob_start函数的使用说明
2013/11/11 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
JavaScript 题型问答有答案参考
2010/02/17 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
简述JS控制台的使用
2018/07/15 Javascript
基于layui实现高级搜索(筛选)功能
2019/07/26 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
python中range()与xrange()用法分析
2016/09/21 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
英文翻译的自我评价语句
2013/10/04 职场文书
教师党性分析材料
2014/02/04 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
2015年酒店服务员工作总结
2015/05/18 职场文书
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs