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的安全策略
Oct 09 PHP
PHPShop存在多个安全漏洞
Oct 09 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
PHP Zip解压 文件在线解压缩的函数代码
May 26 PHP
typecho插件编写教程(五):核心代码
May 28 PHP
php强制用户转向www域名的方法
Jun 19 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 PHP
Smarty分页实现方法完整实例
May 11 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
为何说PHP引用是个坑,要慎用
Apr 02 PHP
PHP attributes()函数讲解
Feb 03 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删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
PHP数据过滤的方法
2013/10/30 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
初中英语课后反思
2014/04/25 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
研讨会致辞
2015/07/31 职场文书
教师节主题班会教案
2015/08/17 职场文书