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 相关文章推荐
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
php下关于中英数字混排的字符串分割问题
Apr 06 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
Jan 18 PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 PHP
详解PHP中的Traits
Jul 29 PHP
PHP 前加at符合@的作用解析
Jul 31 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
laravel学习笔记之模型事件的几种用法示例
Aug 15 PHP
Yii2框架自定义验证规则操作示例
Feb 08 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 PHP
php post换行的方法
Feb 03 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 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中静态类与静态变量用法的区别分析
2015/01/15 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
python中正则表达式的使用详解
2014/10/17 Python
Python使用chardet判断字符编码
2015/05/09 Python
python函数局部变量用法实例分析
2015/08/04 Python
python3中eval函数用法使用简介
2019/08/02 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
时尚圣经:The Fashion Bible
2019/03/03 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
JDK安装目录下有哪些内容
2014/08/25 面试题
自我鉴定总结
2014/03/24 职场文书
本科生求职信
2014/06/17 职场文书
材料物理专业求职信
2014/09/01 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
法人代表证明书范本
2015/06/18 职场文书
关于车尾的标语大全
2015/08/11 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
QT与javascript交互数据的实现
2021/05/26 Javascript