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 相关文章推荐
一道求$b相对于$a的相对路径的php代码
Aug 08 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
Oct 12 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
Jun 13 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
Aug 20 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
Feb 02 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
Dec 22 PHP
Yii2.0预定义的别名功能小结
Jul 04 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 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
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
犀利的js 函数集合
2009/06/11 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
python 简单的多线程链接实现代码
2016/08/28 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
简单了解django文件下载方式
2020/02/10 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
python re模块和正则表达式
2021/03/24 Python
会计专业推荐信
2013/10/29 职场文书
初婚初育证明
2014/01/14 职场文书
2014年教师工作总结
2014/11/10 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
一文带你探究MySQL中的NULL
2021/11/11 MySQL