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
PHP中Session的概念
Oct 09 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
Feb 01 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
php使用codebase生成随机数
Mar 25 PHP
PHP制作百度词典查词采集器
Jan 29 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
Jan 07 PHP
php中关于长度计算容易混淆的问题分析
May 27 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
php rsa 加密,解密,签名,验签详解
Dec 06 PHP
PHP微信PC二维码登陆的实现思路
Jul 13 PHP
php 解析非标准json、非规范json
Apr 01 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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
Python中优化NumPy包使用性能的教程
2015/04/23 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
Python time库基本使用方法分析
2019/12/13 Python
python和php学习哪个更有发展
2020/06/17 Python
virtualenv介绍及简明教程
2020/06/23 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
白色公司:The White Company
2017/10/11 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
项目专员岗位职责
2013/12/04 职场文书
总裁秘书岗位职责
2013/12/04 职场文书
运动会通讯稿50字
2014/01/30 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
有趣的广告词
2014/03/18 职场文书
公司聘任书模板
2014/03/29 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
检讨书模板
2015/01/29 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
九年级英语教学反思
2016/02/15 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python