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 相关文章推荐
Windows2003 下 MySQL 数据库每天自动备份
Dec 21 PHP
php 缓存函数代码
Aug 27 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 PHP
组合算法的PHP解答方法
Feb 04 PHP
php自动加载机制的深入分析
Jun 08 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
详解PHP实现执行定时任务
Dec 21 PHP
PHP中的数组处理函数实例总结
Jan 09 PHP
php单链表实现代码分享
Jul 04 PHP
php读取本地json文件的实例
Mar 07 PHP
PHP命令Command模式用法实例分析
Aug 08 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 smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
一个tab标签切换效果代码
2009/03/27 Javascript
jquery select操作的日期联动实现代码
2009/12/06 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
JS中递归函数
2016/06/17 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
Python中的__slots__示例详解
2017/07/06 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
服务行业个人求职的自我评价
2013/12/12 职场文书
教师四风问题整改措施
2014/09/25 职场文书
教师党员承诺书2015
2015/01/21 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
golang使用map实现去除重复数组
2022/04/14 Golang