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源码之explode使用说明
Aug 05 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
PHP转换IP地址到真实地址的方法详解
Jun 09 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
PHP使用ob_start生成html页面的方法
Nov 07 PHP
ThinkPHP处理Ajax返回的方法
Nov 22 PHP
php的sso单点登录实现方法
Jan 08 PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
Jun 19 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
php使用fullcalendar日历插件详解
Mar 06 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
Mar 18 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判断文件是否存在、是否可读、目录是否存在的代码
2012/10/03 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php显示时间常用方法小结
2015/06/05 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
Jquery 常用方法经典总结
2010/01/28 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
python scipy卷积运算的实现方法
2019/09/16 Python
python多进程间通信代码实例
2019/09/30 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
竞选班干部演讲稿300字
2014/08/20 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
公司租房协议书
2014/10/14 职场文书
学校政风行风整改方案
2014/10/25 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
Python sklearn分类决策树方法详解
2022/09/23 Python