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源代码
Aug 21 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
Aug 12 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
Jun 17 PHP
PHP内核探索:变量存储与类型使用说明
Jan 30 PHP
初识laravel5
Mar 02 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
Mar 23 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
May 16 PHP
[原创]php简单隔行变色功能实现代码
Jul 09 PHP
php生成网页桌面快捷方式
May 05 PHP
PHP环形链表实现方法示例
Sep 15 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 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常用的文件操作函数经典收藏
2013/04/02 PHP
jquery $.each() 使用小探
2013/08/23 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
简单学习Python time模块
2016/04/29 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
Python WEB应用部署的实现方法
2019/01/02 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
Python多线程获取返回值代码实例
2020/02/17 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
python 星号(*)的多种用途
2020/09/21 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
HashMap和Hashtable的区别
2013/05/18 面试题
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
社保转移委托书范本
2014/10/08 职场文书
七年级作文之下雨天
2019/12/23 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android