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调用Java对象的方法
Oct 09 PHP
一步一步学习PHP(4) php 函数 补充2
Feb 15 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
php导出word格式数据的代码实例
Nov 25 PHP
php对二维数组按指定键值key排序示例代码
Nov 26 PHP
php+mysql实现数据库随机重排实例
Oct 17 PHP
php中Snoopy类用法实例
Jun 19 PHP
PHP中的流(streams)浅析
Jul 02 PHP
详解php中反射的应用
Mar 15 PHP
PHP中串行化用法示例
Nov 16 PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 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应该掌握的调试手段
2013/06/20 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
JS使用JSON作为参数实例分析
2016/06/23 Javascript
js微信分享API
2020/10/11 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
关于使用axios的一些心得技巧分享
2017/07/02 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
微信小程序嵌入腾讯视频源过程详解
2019/08/08 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
python发送邮件接收邮件示例分享
2014/01/21 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
详解flask入门模板引擎
2018/07/18 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
Python与C/C++的相互调用案例
2021/03/04 Python
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
Shell如何接收变量输入
2016/08/06 面试题
技术副厂长岗位职责
2013/12/26 职场文书
大学四年职业生涯规划书范文
2014/01/02 职场文书
开展创先争优活动总结
2014/08/28 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL