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 相关文章推荐
使用 MySQL 开始 PHP 会话
Dec 21 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
PHP中获取文件扩展名的N种方法小结
Feb 27 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php eval函数用法 PHP中eval()函数小技巧
Oct 31 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
浅谈discuz密码加密的方式
May 22 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
php实现统计网站在线人数的方法
May 12 PHP
3种方法轻松处理php开发中emoji表情的问题
Jul 18 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
php多文件上传下载示例分享
2014/02/20 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
2010/10/17 Javascript
jquery提升性能最佳实践小结
2010/12/06 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
Python合并多个装饰器小技巧
2015/04/28 Python
简单谈谈python中的多进程
2016/11/06 Python
关于python的list相关知识(推荐)
2017/08/30 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
Python用Jira库来操作Jira
2020/12/28 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
打架检讨书2000字
2014/02/22 职场文书
《识字五》教学反思
2014/03/01 职场文书
毕业生应聘求职信
2014/07/10 职场文书
市场策划求职信
2014/08/07 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技