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 相关文章推荐
js下函数般调用正则的方法附代码
Jun 22 PHP
php 获取一个月第一天与最后一天的代码
May 16 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
Jun 05 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
Jun 17 PHP
php时间戳转换的示例
Mar 31 PHP
php模拟post提交数据的方法
Feb 12 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
[原创]php使用curl判断网页404(不存在)的方法
Jun 23 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
Sep 22 PHP
PHP 实现文件压缩解压操作的方法
Jun 14 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 empty函数 使用说明
2009/08/10 PHP
javascript 三种编解码方式
2010/02/01 Javascript
JavaScript 注册事件代码
2011/01/27 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
JS实现DIV高度自适应窗口示例
2017/02/16 Javascript
详解vue.js的devtools安装
2017/05/26 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
用Python 执行cmd命令
2020/12/18 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
技术总监岗位职责
2013/12/05 职场文书
欠款证明
2015/06/24 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
如何写通讯稿
2015/07/22 职场文书
班主任远程培训研修日志
2015/11/13 职场文书