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结束标签的使用细节探讨及联想
Mar 04 PHP
基于MySQL到MongoDB简易对照表的详解
Jun 03 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
Jun 21 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
Jul 03 PHP
php解决约瑟夫环示例
Apr 09 PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 PHP
PHP模板引擎Smarty中的保留变量用法分析
Apr 11 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
php生成word并下载代码实例
Mar 15 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
Jun 06 PHP
php遍历目录下文件并按修改时间排序操作示例
Jul 12 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
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
Python编写一个优美的下载器
2018/04/15 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
python爬虫可以爬什么
2020/06/16 Python
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
语文教育专业推荐信范文
2013/11/25 职场文书
销售行政专员职责
2014/01/03 职场文书
《金子》教学反思
2014/04/13 职场文书
实习生工作证明范本
2014/09/14 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
劳动模范获奖感言
2015/07/31 职场文书
感恩老师主题班会
2015/08/12 职场文书
小学音乐课教学反思
2016/02/18 职场文书
七年级作文之我的梦想
2019/10/16 职场文书
Mysql中常用的join连接方式
2022/05/11 MySQL