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巧获服务器端信息
Dec 06 PHP
php通用防注入程序 推荐
Feb 26 PHP
php懒人函数 自动添加数据
Jun 28 PHP
Function eregi is deprecated (解决方法)
Jun 21 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
Dec 25 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
CakePHP框架Model关联对象用法分析
Aug 04 PHP
PHP实现打包下载文件的方法示例
Oct 07 PHP
PHP使用SOAP调用API操作示例
Dec 25 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 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仿ZOL分页类代码
2008/10/02 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
php读取3389的脚本
2014/05/06 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
PHP curl使用实例
2015/07/02 PHP
eclipse php wamp配置教程
2016/06/30 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
javascript hasFocus使用实例
2010/06/29 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
Python多线程thread及模块使用实例
2020/04/28 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
会计专业毕业生自荐书
2014/06/25 职场文书
宣传普通话标语
2014/06/27 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
详解Python函数print用法
2021/06/18 Python
Minikube搭建Kubernetes集群
2022/03/31 Servers