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通过session id 实现session共享和登录验证的代码
Jun 03 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
Dec 25 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
magento后台无法登录解决办法的两种方法
Dec 09 PHP
PHP封装的PDO数据库操作类实例
Jun 21 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 PHP
Yii框架学习笔记之session与cookie简单操作示例
Apr 30 PHP
php抽象方法和普通方法的区别点总结
Oct 13 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 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实现基于栈的后缀表达式求值功能
2017/11/10 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP7修改的函数
2021/03/09 PHP
jquery 快速回到页首的方法
2013/12/05 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
Vue中keep-alive组件作用详解
2020/02/04 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
python3访问sina首页中文的处理方法
2014/02/24 Python
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
python进阶教程之循环对象
2014/08/30 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
Python中防止sql注入的方法详解
2017/02/25 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
法院实习人员自我鉴定
2013/09/26 职场文书
学校经典推荐信
2013/10/30 职场文书
市场营销管理制度
2014/01/29 职场文书
建筑工地宣传标语
2014/06/18 职场文书
赔偿协议书范本
2014/09/12 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
建国大业观后感800字
2015/06/01 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书