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 相关文章推荐
在任意字符集下正常显示网页的方法二(续)
Apr 01 PHP
php学习之 认清变量的作用范围
Jan 26 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
Parse正式发布开源PHP SDK
Aug 11 PHP
php分页函数完整实例代码
Sep 22 PHP
CakePHP框架Model函数定义方法示例
Aug 04 PHP
PHP判断json格式是否正确的实现代码
Sep 20 PHP
PHP 记录访客的浏览信息方法
Jan 29 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP学习记录之数组函数
Jun 01 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
Jul 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
apache中为php 设置虚拟目录
2014/12/17 PHP
微信支付开发发货通知实例
2016/07/12 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
javascript 写类方式之四
2009/07/05 Javascript
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
浅谈js原生拖放
2016/11/21 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
Python中判断输入是否为数字的实现代码
2018/05/26 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
python中如何使用insert函数
2020/01/09 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
UNIX文件系统分类
2014/11/11 面试题
旷课检讨书大全
2014/01/21 职场文书
端午节粽子促销活动方案
2014/02/02 职场文书
师范毕业生求职信
2014/07/11 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技
JS封装cavans多种滤镜组件
2022/02/15 Javascript