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 相关文章推荐
PHP脚本的10个技巧(5)
Oct 09 PHP
windows下PHP APACHE MYSQ完整配置
Jan 02 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
php无限遍历目录示例
Feb 21 PHP
thinkphp实现图片上传功能分享
Mar 04 PHP
PHP如何将log信息写入服务器中的log文件
Jul 29 PHP
php给图片加文字水印
Jul 31 PHP
php实现简易聊天室应用代码
Sep 23 PHP
Laravel网站打开速度优化的方法汇总
Jul 16 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
php扩展开发入门demo示例
Sep 23 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中的超全局变量
2006/10/09 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
php防止表单重复提交实例讲解
2019/02/11 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
vue内置指令详解
2018/04/03 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
用python生成1000个txt文件的方法
2018/10/25 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
Python使用进程Process模块管理资源
2020/03/05 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
护士检查书
2014/01/17 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
十八大演讲稿
2014/05/22 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
Python访问Redis的详细操作
2021/06/26 Python
浅谈Python魔法方法
2021/06/28 Java/Android
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS