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 XML操作类DOMDocument
Dec 16 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
Jan 27 PHP
比较好用的PHP防注入漏洞过滤函数代码
Apr 11 PHP
Session服务器配置指南与使用经验的深入解析
Jun 17 PHP
php表单请求获得数据求和示例
May 15 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
Jan 22 PHP
php数据访问之增删改查操作
May 09 PHP
php微信公众平台配置接口开发程序
Sep 22 PHP
highchart数据源纵轴json内的值必须是int(详解)
Feb 20 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
PHP写的简单数字验证码实例
May 23 PHP
PHP asXML()函数讲解
Feb 03 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
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
设定php简写功能的方法
2019/11/28 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
jQuery autocomplete插件修改
2009/04/17 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
分享15个最受欢迎的Python开源框架
2014/07/13 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
python生成器与迭代器详解
2019/01/01 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
大学生入党自我鉴定
2013/10/31 职场文书
后勤部长岗位职责
2013/12/14 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
财务会计实训报告
2014/11/05 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
Python图片检索之以图搜图
2021/05/31 Python
python代码实现扫码关注公众号登录的实战
2021/11/01 Python