PHP观察者模式实例分析【对比JS观察者模式】


Posted in PHP onMay 22, 2019

本文实例讲述了PHP观察者模式。分享给大家供大家参考,具体如下:

1.用js实现观察者模式

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
    div{width: 100px;height: 100px;border: 1px #999 solid;margin-bottom: 5px;}
    </style>
</head>
<body>
<!--
我们让div对象观察select的变化,selecte变化就会通知这个2个对象,并引起这2个对象的变化,实现观察者模式。
 -->
 <h1>用观察者模式切换页面风格</h1>
 <select>
     <option value="male">男式风格</option>
     <option value="female">女士风格</option>
 </select>
 <button onclick="t1()">观察学习区</button>
 <button onclick="t2()">不观察学习区</button>
 <div id="content">我是内容</div>
 <div id="ad">我是广告</div>
 <div id="study">学习</div>
</body>
<script type="text/javascript">
    var sel = document.getElementsByTagName('select')[0];
    sel.observers = {};
    sel.attach = function(key,obj){
        this.observers[key] = obj;
    }
    sel.detach = function(key){
        delete this.observers[key];
    }
    sel.onchange = sel.notify = function(){
        for(var key in this.observers){
            this.observers[key].update(this);
        }
    }
    //客户端
    var content = document.getElementById('content');
    var ad = document.getElementById('ad');
    content.update = function(ob){
        if (ob.value == 'male') {
            this.style.backgroundColor = 'gray';
        }else if(ob.value == 'female'){
            this.style.backgroundColor = 'pink';
        }
    }
    ad.update = function(ob){
        if (ob.value == 'male') {
            this.innerHTML = '汽车';
        }else if(ob.value == 'female'){
            this.innerHTML = '减肥';
        }
    }
    //让content观察select的变化
    sel.attach('content',content);
    sel.attach('ad',ad);
    //新增监听study区
    var study = document.getElementById('study');
    study.update = function(ob){
        if (ob.value == 'male') {
            this.innerHTML = '学习计算机';
        }else if(ob.value == 'female'){
            this.innerHTML = '学习美容';
        }
    }
    sel.attach('study',study);
    function t1(){
        sel.attach('study',study);
    }
    function t2(){
        sel.detach('study');
    }
</script>
</html>

2.用php实现观察模式

<?php
//php实现观察者
//php5中提供观察者observer和被观察者subject的接口
class User implements SplSubject
{
    public $lognum;
    public $hobby;
    protected $observers = null;
    public function __construct($hobby)
    {
        $this->lognum = rand(1,10);
        $this->hobby = $hobby;
        $this->observers = new SplObjectStorage();
    }
    public function login()
    {
        //操作session等
        $this->notify();
    }
    public function attach(SPLObserver $observer)
    {
        $this->observers->attach($observer);
    }
    public function detach(SPLObserver $observer)
    {
        $this->observers->detach($observer);
    }
    public function notify()
    {
        $this->observers->rewind();
        while ($this->observers->valid()) {
            $observer = $this->observers->current();
            $observer->update($this);
            $this->observers->next();
        }
    }
}
//用户安全登录模块
class Safe implements SPLObserver
{
    public function update(SplSubject $subject)
    {
        if ($subject->lognum < 3) {
            echo '这是第' . $subject->lognum . '次安全登录<br>';
        }else{
            echo '这是第' . $subject->lognum . '次登录,异常<br>';
        }
    }
}
//广告模块
class Ad implements SPLObserver
{
    public function update(SplSubject $subject)
    {
        if ($subject->hobby == 'sports') {
            echo '英超开始啦<br>';
        }else{
            echo '好好学习<br>';
        }
    }
}
//实施观察
// $user = new User('sports');
$user = new User('study');
$user->attach(new Safe());
$user->attach(new Ad());
$user->login();//登录

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
推荐文章系统(一)
Oct 09 PHP
phpfans留言版用到的install.php
Jan 04 PHP
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
Feb 22 PHP
php自定义函数call_user_func和call_user_func_array详解
Jul 14 PHP
兼容firefox,chrome的网页灰度效果
Aug 08 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
PHP中使用memcache存储session的三种配置方法
Apr 05 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
CI框架实现cookie登陆的方法详解
May 18 PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 #PHP
在Laravel5中正确设置文件权限的方法
May 22 #PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 #PHP
thinkphp5框架API token身份验证功能示例
May 21 #PHP
php curl操作API接口类完整示例
May 21 #PHP
PHP钩子实现方法解析
May 21 #PHP
php面向对象程序设计中self与static的区别分析
May 21 #PHP
You might like
php目录操作实例代码
2014/02/21 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
Python实现的异步代理爬虫及代理池
2017/03/17 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
python利用线程实现多任务
2020/09/18 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
新闻网站实习自我鉴定
2013/09/25 职场文书
作弊检讨书1000字
2014/02/01 职场文书
大学学风建设方案
2014/05/04 职场文书
品质标语大全
2014/06/21 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
离婚案件被告代理词
2015/05/23 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
2016新年晚会开场白
2015/12/03 职场文书
师德培训心得体会2016
2016/01/09 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL