专栏首页恩蓝脚本PHP观察者模式实例分析【对比JS观察者模式】

PHP观察者模式实例分析【对比JS观察者模式】

本文实例讲述了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();//登录

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • php+laravel依赖注入知识点总结

    laravel容器包含控制反转和依赖注入,使用起来就是,先把对象bind好,需要时可以直接使用make来取就好。

    砸漏
  • thinkphp5+layui实现的分页样式示例

    本文实例讲述了thinkphp5+layui实现的分页样式。分享给大家供大家参考,具体如下:

    砸漏
  • PHP面向对象程序设计(OOP)之方法重写(override)操作示例

    本文实例讲述了PHP面向对象程序设计(OOP)之方法重写(override)操作。分享给大家供大家参考,具体如下:

    砸漏
  • php面向对象中static静态属性和静态方法的调用

    这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下 本文实例...

    joshua317
  • MVVM模式的理解

    MVVM全称Model-View-ViewModel是基于MVC和MVP体系结构模式的改进,MVVM就是MVC模式中的View的状态和行为抽象化,将视图UI和业...

    WindrunnerMax
  • 前端图表可视化的应用实践总结

    腾讯企鹅辅导在学生上课结束后推送“学习报告”,是课程所提供的一项重要服务。家长在“学习报告”中能查看孩子上课时间及互动情况,答题及掌握知识点,作业考试分数,班级...

    IMWeb前端团队
  • Vue.js系列之四计算属性和观察者

    一、计算属性 1、模版内的表达式非常便利,但是设计它们的初衷是用于简单计算的。在模版中放入太多的逻辑运算会让模版过重且难以维护,例如如下代码: <div id=...

    郑小超.
  • 前端-微信小程序开发(4):打造自己的UI库

    github地址:https://github.com/yexiaochai/wxdemo

    grain先森
  • 深入理解JavaScript系列(37):设计模式之享元模式

    享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。

    用户4962466
  • js写插件教程深入

    连小壮

扫码关注云+社区

领取腾讯云代金券