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 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
PHP的autoload自动加载机制使用说明
Dec 28 PHP
深入解析Session是否必须依赖Cookie
Aug 02 PHP
typecho插件编写教程(二):写一个新插件
May 28 PHP
php实现多城市切换特效
Aug 09 PHP
Yii调试查看执行SQL语句的方法
Jul 15 PHP
详谈phpAdmin修改密码后拒绝访问的问题
Apr 03 PHP
PHP实现查询手机归属地的方法详解
Apr 28 PHP
PHP实现将标点符号正则替换为空格的方法
Aug 09 PHP
IOS 开发之NSDictionary转换成JSON字符串
Aug 14 PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 PHP
Laravel自动生成UUID,从建表到使用详解
Oct 24 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实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
PHP简单日历实现方法
2016/07/20 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
javascript加号&quot;+&quot;的二义性说明
2013/03/04 Javascript
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
动态加载js文件简单示例
2016/04/21 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
MockJs结合json-server模拟后台数据
2020/08/26 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
详解Python中with语句的用法
2015/04/15 Python
使用Python读取大文件的方法
2018/02/11 Python
python查看模块,对象的函数方法
2018/10/16 Python
python3实现名片管理系统
2020/11/29 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
东方红海科技面试题软件测试方面
2012/02/08 面试题
WSDL的操作类型主要有几种
2013/07/19 面试题
业务员薪酬管理制度
2014/01/15 职场文书
协议书样本
2014/04/23 职场文书
公司运动会策划方案
2014/05/25 职场文书
体育馆的标语
2014/06/24 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
2015年前台个人工作总结
2015/04/03 职场文书