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数据缓存技术
Feb 14 PHP
php模拟asp中的XmlHttpRequest实现http请求的代码
Mar 24 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
Jun 17 PHP
关于Sphinx创建全文检索的索引介绍
Jun 25 PHP
php仿QQ验证码的实例分析
Jul 01 PHP
linux系统下php安装mbstring扩展的二种方法
Jan 20 PHP
apache中为php 设置虚拟目录
Dec 17 PHP
php如何获取文件的扩展名
Oct 28 PHP
简介PHP的Yii框架中缓存的一些高级用法
Mar 29 PHP
php中this关键字用法分析
Dec 07 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
PHP实现简单登录界面
Oct 23 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代码
2006/12/06 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
2012/12/06 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
2017/02/04 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
PDO::commit讲解
2019/01/27 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
2019/11/21 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
python re正则表达式模块(Regular Expression)
2014/07/16 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
班组长岗位职责
2014/03/03 职场文书
会计系毕业生求职信
2014/05/28 职场文书
国际经济贸易专业自荐信
2014/06/13 职场文书
数学备课组工作总结
2015/08/12 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书
python实现过滤敏感词
2021/05/08 Python
python 进阶学习之python装饰器小结
2021/09/04 Python
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL