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
一个PHP操作Access类(PHP+ODBC+Access)
Jan 02 PHP
php中函数的形参与实参的问题说明
Sep 01 PHP
关于PHP堆栈与列队的学习
Jun 21 PHP
基于PHP中的常用函数回顾
Jul 11 PHP
PHP数组排序之sort、asort与ksort用法实例
Sep 08 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
php面向对象与面向过程两种方法给图片添加文字水印
Aug 26 PHP
php获取linux命令结果的实例
Mar 13 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 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
ThinkPHP的I方法使用详解
2014/06/18 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
Python常见工厂函数用法示例
2018/03/21 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
Django 过滤器汇总及自定义过滤器使用详解
2019/07/19 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
python opencv实现简易画图板
2020/08/27 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
简历中的自我评价怎么写
2014/01/29 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
考研导师推荐信范文
2015/03/27 职场文书
领导欢送会主持词
2015/07/06 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python
Android中View.post和Handler.post的关系
2022/06/05 Java/Android
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL