Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >javascript设计模式三:代理模式

javascript设计模式三:代理模式

作者头像
前端_AWhile
发布于 2019-08-29 06:39:31
发布于 2019-08-29 06:39:31
30700
代码可运行
举报
文章被收录于专栏:前端一会前端一会
运行总次数:0
代码可运行

代理模式是一种对程序对象进行控制性访问的一类解决方案。

引入代理模式,其实是为了实现单一职责的面向对象设计原则。

单一职责其实就是指在一个类中(js中通常指对象和函数等),应仅有一个引起它变化的原因。这样会帮助程序设计具有良好的健壮和高内聚特性,从而当变化发生时,程序设计会尽量少的受到意外破坏。

代理模式有多种方法,保护代理、远程代理、虚拟代理、缓存代理等。

但在javascript中,代理模式最常用到的两种方法是虚拟代理和缓存代理。

虚拟代理

在理解虚拟代理时,可以将其想象为一个经纪人,客户程序需要通过这个虚拟代理(经纪人)来调用本体对象的方法。

虚拟代理示例demo1: 图片loading预加载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//通过虚拟代理实现图片预加载

//代理模式进行图片预加载的实现思路是: 通过代理对象获取实际显示图片地址并进行加载,同时先让本体对象显示预加载图片,待代理对象将实际图片地址加载完毕后传递给本体对象进行显示即可。

//本体对象
var myImage = (function(){
    var imgNode = new Image()
    document.body.appendChild(imgNode)

    return {
        setSrc: function(src){
            imgNode.src = src
        }
    }
})()

//代理对象
var proxyImage = (function(){
    var img = new Image();          //1、代理对象新建一个img对象
    img.onload = function(){        //4、代理对象img加载真实图片src完成后将src传递给本体对象显示
        myImage.setSrc(this.src)
    }
    return {
        setProxySrc: function(src){
            myImage.setSrc('../images/loding.gif')  //2、代理对象控制本体对象使用加载图片src
            img.src = src                   //3、代理对象的img对象获取将要传递给本体对象的真实图片src
        }
    }
})()

//通过代理对象来对本体对象进行访问
proxyImage.setProxySrc('https://p1.ssl.qhimgs1.com/t0153297036f4471d81.jpg')

虚拟代理示例demo2:合并HTTP请求,减少网络请求资源消耗

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>代理模式-虚拟代理合并HTTP请求</title>
</head>
<body>
<div>
    <input type="checkbox" id="1" />1
    <input type="checkbox" id="2" />2
    <input type="checkbox" id="3" />3
    <input type="checkbox" id="4" />4
    <input type="checkbox" id="5" />5
    <input type="checkbox" id="6" />6
    <input type="checkbox" id="7" />7
    <input type="checkbox" id="8" />8
    <input type="checkbox" id="9" />9
</div> 
</body>
<script>
var synchronousFile = function(id){
    console.log('开始同步:' + id);
}

var proxySynchronousFile = (function(){
    var cache = [],     //保存一段时间内需要同步的id
        timer;      //定时器

    //闭包函数
    return {
        proxySyncFile: function(id){    
            cache.push(id)

            if(timer){      //保证不会覆盖已经启动的定时器
                return
            }

            timer = setTimeout(function(){
                synchronousFile(cache.join(','))       //2秒后向本体对象发送需要同步的ID集合
                clearTimeout(timer)         //清空定时器
                timer = null
                cache.length = 0    //清空id集合
            }, 2000)
        }
    }
})()

var check = document.getElementsByTagName('input')
for(var i=0; i<check.length; i++){
    check[i].onclick = function(){
        proxySynchronousFile.proxySyncFile(this.id)
    }
}
</script>
</html>

缓存代理

缓存代理可以为一些开销大的运算结果提供暂时存储,在下次运算时,如果传递进来的参数和之前的一致,则可以直接返回前面存储的结果

缓存代理示例demo: 计算乘积

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>代理模式-缓存代理</title>
</head>
<body>
<input type="text" id="input1">*
<input type="text" id="input2">
<div id="result"></div>
<button type="button" id="btn">计算</button>
</body>
<script>

//缓存代理示例: 计算乘积
//本体对象
var calculate = function(){
    var a = 1;
    for(var i=0; i<arguments.length; i++){
        a = a*arguments[i]
    }
    return a;
}

//代理对象,创建缓存代理的工厂,参数fn可以为任意需要进行代理的函数,除了上述计算乘积的本体对象函数外,还可以是计算加减或进行其他操作的本体函数
var proxyCalculate = function(fn){
    var resultCache = {};

    return function(){
        var args = Array.prototype.join.call(arguments, ',')
        if(args in resultCache){        //测试对象中是否有对应的name,有则直接返回该name的值
            return resultCache[args]
        }
        return resultCache[args] = fn.apply(this, arguments)
    }
}


document.getElementById('btn').onclick = function(){
    var v1 = document.getElementById('input1').value
    var v2 = document.getElementById('input2').value
    var result = proxyCalculate(calculate)(v1, v2)

    document.getElementById('result').innerHTML = result
}

//总结: 代理模式还有多种,比如保护代理、远程代理等,但js中常用的代理模式有虚拟代理和缓存代理两种。
</script>
</html>

在编写业务代码时,并不需要一开始就考虑是否使用代理模式,只要当发现使用代理模式更方便时,再编写代理对象即可。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小二 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
「设计模式 JavaScript 描述」代理模式
代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景。比如,明星都有经纪人作为代理。如果想请明星来办一场商业演出,只能联系他的经纪人。经纪人会把商业演出的细节和报酬都谈好之后,再把合同交给明星签。
用户8921923
2022/10/24
3720
JavaScript设计模式--代理模式
代理模式:为一个对象提供一个代用品或占位符,以便控制对它的访问。 代理分为:保护代理和虚拟代理 保护代理:用于控制不同权限的对象对目标对象的访问,在JavaScript中很难判断谁访问了某个对象,所以保护代理很难实现。
奋飛
2019/08/15
4350
学习《JavaScript设计模式与开发实践》- 代理模式
最近在学习《JavaScript设计模式与开发实践》一书,每看完一个模块,会写一篇文档来做为笔记,如果你也在学习JS设计模式,欢迎留言交流。
Jou
2022/08/10
2550
从“图片预加载”认识代理设计模式
当我们需要获取某个对象的方法或属性的时候,由于权限等限制无法获取,然后通过一个有权限的代理对象转发我们的获取请求,代理对象可对请求预处理,同时在返回结果的时候也可以做处理。
小东同学
2022/07/29
7960
从“图片预加载”认识代理设计模式
JavaScript设计模式 代理模式
代理模式的关建是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际访问的是替身对象,替身对象对请求做出一些处理后,再把请求转交给本体对象。
菜的黑人牙膏
2019/01/21
3470
【说站】JavaScript代理模式的分类
1、代理的类型主要包括保护代理和虚拟代理。保护代理用于控制不同权限对象对目标对象的访问。
很酷的站长
2022/11/24
2370
【说站】JavaScript代理模式的分类
JavaScript-设计模式·设计模式(上)
本篇是《JavaScript 设计模式与开发实践》第二部分读书笔记,总结前 7 种设计模式:单例模式、策略模式、代理模式、迭代器模式、发布-订阅模式、命令模式、组合模式。
数媒派
2022/12/01
4670
JavaScript 设计模式 —— 代理模式
Emm...最近绩效评估季,绩效总结、360 评估,要写的东西比较多嚯,耽搁了一段时间
前端LeBron
2022/11/21
4840
JavaScript 设计模式 —— 代理模式
修炼内功之JavaScript设计模式(二)
一旦我们将这些设计模式整理学习并融会贯通后,便可以大大增强我们的编程功底,在遇到实际业务需求时,给我们提供更好的解决问题的思路。
童欧巴
2020/03/30
4360
修炼内功之JavaScript设计模式(二)
懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!
沉浸式趣谈
2024/03/13
840
懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!
设计模式 - 代理模式 - JavaScript
代理模式可以解决避免对一些对象的直接访问,以此为基础,常见的有保护代理和虚拟代理。保护代理可以在代理中直接拒绝对对象的访问;虚拟代理可以延迟访问到真正需要的时候,以节省程序开销。
心谭博客
2020/04/20
3520
介绍几个JavaScript设计模式及场景应用
当然我们可以用一个通俗的说法:设计模式是解决某个特定场景下对某种问题的解决方案。因此,当我们遇到合适的场景时,我们可能会条件反射一样自然而然想到符合这种场景的设计模式。
winty
2020/04/14
7440
JavaScript设计模式之代理模式
当你想买商业保险的时候,却不得不亲自去了解不同公司的方案和限制。在自己百忙之中分神和不同的销售博弈。有了职业的保险经纪人,你只要向他/她讲述你的需求,经纪人就用自己的关系量身定做了一套方案给你。买哪家,怎么买,等等。保险经纪代理的模式,很好地体现了程序设计关注点分离的思想。
一粒小麦
2019/10/30
3400
JavaScript设计模式之代理模式
每天一个设计模式·代理模式
代理模式可以解决避免对一些对象的直接访问,以此为基础,常见的有保护代理和虚拟代理。保护代理可以在代理中直接拒绝对对象的访问;虚拟代理可以延迟访问到真正需要的时候,以节省程序开销。
py3study
2020/01/06
3430
【说站】js代理模式怎么用?
1、常用的虚拟代理形式:某个耗费大的操作可以通过虚拟代理延迟到需要它的时候创建(例如,使用虚拟代理实现图像的懒惰加载)。
很酷的站长
2022/11/24
2.9K0
【说站】js代理模式怎么用?
使用JavaScript学习设计模式
之后紧接着买了这本JavaScript 设计模式核⼼原理与应⽤实践,刚好最近有小册免费学的活动,就赶紧把这篇笔记整理出来了,并且补充了小册子中的没有写到的其余设计模式,学习过程中结合 JavaScript 编写的例子,以便于理解和加深印象。
九旬
2021/04/12
7410
使用JavaScript学习设计模式
深入理解JavaScript系列(31):设计模式之代理模式
代理模式使得代理对象控制具体对象的引用。代理几乎可以是任何对象:文件,资源,内存中的对象,或者是一些难以复制的东西。
用户4962466
2020/01/15
4040
JS设计模式 - 笔记
定义:定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换。把看似毫无联系的代码提取封装、复用,使之更容易被理解和扩展。
TagBug
2023/03/16
8570
BAT 前端开发面经 —— 吐血总结
最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘,在此总结一下 一是备忘、总结提升,二是希望给大家一些参考 其他面试及基础相关可以参考其他博文:
超然
2018/08/03
1.4K0
BAT 前端开发面经 ——  吐血总结
javascript中常用的设计模式,教你写出更好的前端代码
今天给大家介绍js中常用的设计模式,也让自己对js设计模式有一个更清晰的认识,下面我们直接进入今日的主题
前端老鸟
2019/07/31
1.1K0
推荐阅读
相关推荐
「设计模式 JavaScript 描述」代理模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验