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中GET变量的使用
Oct 09 PHP
PHP新手上路(十三)
Oct 09 PHP
php smarty函数扩展
Mar 15 PHP
php购物车实现代码
Oct 10 PHP
PHP反转字符串函数strrev()函数的用法
Feb 04 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
Sep 19 PHP
ThinkPHP中session函数详解
Sep 14 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
php strftime函数获取日期时间(switch用法)
May 16 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
Jun 09 PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 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版淘宝网查询商品接口代码示例
2014/06/17 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
深入理解Javascript闭包 新手版
2010/12/28 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
python常用函数与用法示例
2019/07/02 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
大学军训感言1500字
2014/03/09 职场文书
疾病防治方案
2014/05/31 职场文书
企业文化理念标语
2014/06/10 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
2015毕业寄语大全
2015/02/26 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
交通安全宣传标语(100条)
2019/08/22 职场文书