Javascript设计模式(五)代理模式

news/2024/11/9 17:32:22
使用者无权访问目标对象,通过代理做授权和控制

代理模式是一种非常有意义的模式。在生活中也能找到代理模式的情景,比如,明星都有经纪人作为代理,如果想请明星来办一场商业演出,只能联系他的经纪人,经纪人会把商业演出的细节和报酬都谈好之后,再将合同交给明星签。

代理实现图片懒加载

在前端开发中,图片懒加载是一项非常实用的技术。为了性能优化,我们常常在图片加载之前用一张图片占位,等图片加载完成之后再将图片填充到src上,这种场景就很容易实用代理模式。

var myImage = (function() {
    var imgNode = document.createElement('img')
    document.body.appendChild(imgNode)
    return {
        setSrc: function(src) {
            imgNode.src = src
        }
    }
})()

var proxyImage = (function(){
    var img = new Image()
    img.onload = function() {
        myImage.setSrc(img.src)
    }
    return {
        setSrc: function(src) {
            myImage.setSrc('./loading.gif')
            img.src = src
        }
    }
})()

proxyImage.setSrc('https://user-gold-cdn.xitu.io/2016/11/29/805fd2776ae656464329c04f63181266?imageView2/1/w/180/h/180/q/85/format/webp/interlace/1')

通过proxyImage间接访问MyImage。proxyImage控制来客户对MyImage的访问,并且在此过程中加入一些额外的操作,比如在图片加载前,先将src设置为本地的loading图。

缓存代理

缓存代理可以为一些开销较大的运算结果暂时的存储,在下次运算时,如果传递的值一致,则可以直接返回前面存储的结果。

// 创建一个乘积函数
var mult = function() {
    console.log('开始计算乘积')
    var a = 1
    for(var i = 0, l = arguments.length; i<l ; i++) {
        a = a*arguments[i]
    }
    return a
}
// 加入缓存代理函数
var proxyMult = (function(){
    var cache = {}
    return function() {
        var args = Array.prototype.join.call(arguments, ',')
        if (args in cache) {
            return cache[args]
        }
        return cache[args] = mult.apply(this, arguments)
    }
})()

proxyMult(1,2,3,4) //24
proxyMult(1,2,3,4) //24

当第二次调用proxyMult的时候,本体mult并没有直接计算,proxyMult直接返回之前的结果

引入代理的意义

为了说明代理的意义,下面引入一个面向对象的设计原则:单一职责原则

  1. 一个类(对象或者函数)而言,应该只能有一个引起它变化的原因。如果一个对象承担了多项职责,那么引起变化的原因可能就有多个。
  2. 实际上增加懒加载图片只是一个景上添花的行为。纵观整个程序,我们并没有改变myImage的接口,但是通过代理,给接口添加了新的行为,如果某天不需要了,也不用修改本体。

http://www.niftyadmin.cn/n/640696.html

相关文章

《可复制的领导力》——樊登书摘

可复制的领导力&#xff1a;樊登的9堂商业课 ◆ 自序 我看出来了&#xff0c;你的短板就在领导力&#xff01; 持续不断地用同样的方法做同一件事情&#xff0c;却期望得到不同的结果&#xff0c;这就叫荒谬” 管理就是最大限度地激发他人的善意 学习可以改变自己。不会就学&a…

《点亮自性之光》——克里希那穆提

点亮自性之光——克里希那穆提 ◆ 心的寂静 在日常生活里&#xff0c;你能不能不跟人较量&#xff1f;试着去做做看&#xff0c;你才能发现个中的旨趣。你会觉得如释重负&#xff1b;除去不必要的负担之后&#xff0c;你就会拥有能量了。 ◆ 全心全意地倾听 你有没有全心全意地…

《清醒思考的艺术》——罗尔夫·多贝里

清醒思考的艺术——罗尔夫多贝里 ◆ 3 过度自信效应 请对所有预测持怀疑态度&#xff0c;尤其是当这些预测是由所谓的专家们作出的。请你在筹划任何事情时都从悲观的角度出发&#xff0c;作最坏的打算。这样你才会真正有机会&#xff0c;更现实一些地判断形势。 ◆ 5 纠缠于沉…

Docker容器的互联

一、docker容器互联的默认方式 在同一个宿主机下&#xff0c;docker的容器是通过虚拟网桥来进行连接的&#xff0c;在默认情况下在同一宿主机中运行的docker容器都是可以互相连接的&#xff0c;docker提供一个允许容器互相连接的选项&#xff1a; –icctrue 默认&#xff0c;表…

Dockerfile的构建过程

一、Dokcerfile的构建过程 步骤1、从基础镜像运行一个容器 步骤2、执行一条指令&#xff0c;对容器做出修改 步骤3、执行类似docker commit的操作&#xff0c;提交一个新的镜像层 步骤4、再基于刚提交的镜像运行一个新容器 步骤5、执行Dockerfile中的下一条指令&#xff0c;直…

《Web全栈工程师的自我修养》——余果. 书摘

Web全栈工程师的自我修养——余果 ◆ 围绕商业目标 要先看看有哪些问题需要解决&#xff0c;然后再补充您的工具箱。 ◆ 获得面试机会 在著名开源项目中贡献代码&#xff0c;说明您有能力阅读和编写好的代码 ◆ 那个什么都懂的家伙 技术是您的武器&#xff0c;成长就是好好打磨…

两道选择题,看完之后全班真的只剩下沉默

记得大学一堂选修课上。教授面带微笑&#xff0c;走进教室&#xff0c;对我们说&#xff1a;“我受一家机构委托&#xff0c;来做一项问卷调查&#xff0c;请同学们帮个忙。”一听这话&#xff0c;教室里轻微的一阵议论开了&#xff0c;大学课堂本来枯燥&#xff0c;这下好玩多…

多阶段构建

一、多阶段构建原理 多阶段构建&#xff0c;是在Dockerfile中使用多个FROM指令&#xff0c;每个FROM指令可以使用不同的基础镜像&#xff0c;并且每个指令都开始一个新的构建&#xff0c;可以选择性地将一个阶段构建中生成的文件复制到另一个阶段&#xff0c;从而在最终image中…