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 相关文章推荐
BBS(php &amp; mysql)完整版(四)
Oct 09 PHP
获取URL文件名后缀
Oct 24 PHP
PHP读取RSS(Feed)简单实例
Jun 12 PHP
php中explode函数用法分析
Nov 15 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 PHP
php 使用fopen函数创建、打开文件详解及实例代码
Sep 24 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
Aug 04 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 PHP
在Laravel的Model层做数据缓存的实现
Sep 26 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
2020最新CPU的性能排名
2020/04/02 数码科技
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
url decode problem 解决方法
2011/12/26 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
浅谈js函数三种定义方式 &amp; 四种调用方式 &amp; 调用顺序
2017/02/19 Javascript
详解vue的数据binding绑定原理
2017/04/12 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
vuex实现购物车功能
2020/06/28 Javascript
python用户管理系统
2018/03/13 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
python super函数使用方法详解
2020/02/14 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
培训班主持词
2014/03/28 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
关于教师节的演讲稿
2014/09/04 职场文书
2015年招聘工作总结
2014/12/12 职场文书
班主任自我评价范文
2015/03/11 职场文书
小学毕业感言100字
2015/07/30 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android