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对象类型判断
Aug 27 PHP
浅谈PHP强制类型转换,慎用!
Jun 06 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
Php中使用Select 查询语句的实例
Feb 19 PHP
codeigniter中测试通过的分页类示例
Apr 17 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
浅析Yii2缓存的使用
May 10 PHP
PHP Cookie学习笔记
Aug 23 PHP
PHP编程实现计算抽奖概率算法完整实例
Aug 09 PHP
PHP实现字符串的全排列详解
Apr 24 PHP
Laravel 创建可以传递参数 Console服务的例子
Oct 14 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 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中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
2014/04/12 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
微信分享invalid signature签名错误踩过的坑
2020/04/11 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
python MySQLdb使用教程详解
2018/03/20 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
python中append实例用法总结
2019/07/30 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
python logging设置level失败的解决方法
2020/02/19 Python
Python类class参数self原理解析
2020/11/19 Python
函授毕业自我鉴定
2013/12/19 职场文书
董事长致辞
2015/07/29 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
使用python求解迷宫问题的三种实现方法
2022/03/17 Python
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫