资讯专栏INFORMATION COLUMN

设计模式之代理模式

Gilbertat / 1398人阅读

摘要:虚拟代理虚拟代理把一些开销很大的对象,延迟到真正需要它的时候才去创建。主要参考设计模式与开发实践

设计模式

在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。

这是在《设计模式》一书中对设计模式的定义。在软件开发过程中,我们可能会遇到过这样的情况,我们现在发现一个问题,和以前的某个问题很相似,几乎可以用统一套解决方案,而且我们还发现,在某个条件下,这个解决方案几乎就是通用的,于是我们决定给解决类似问题的解决方案取一个统一的名字,这就是设计模式。

设计模式的意义

我们都知道无论在哪个行业经验都很重要,而经验的意义也就在于,当我们遇见一个以前遇见过的问题的时候,会自燃的想到以前是怎么解决的。而模式则是经过大量的实际项目验证过的优秀的解决方案,当我们熟悉了模式,就可以在适当的环境下,条件反射式地自如地使用它们。

所有设计模式的实现抖遵循一条原则,即“找出程序中变化的地方,并将变化封装起来”。一个程序的设计总是可以分为可变的部分和不可变的部分。当我们找出可变的部分并把这些部分封装起来,那么剩下的就是不变和稳定的部分。这些不变和稳定的部分是非常容易复用的。这也就是设计模式为什么描写的是可复用面向对象软件基础的原因。

当我看到上面这段话的时候,我就决定要把设计模式要好好的学一学,烂代码到处可见,但是我们不应该让别人看到我们的代码后,觉得写的代码是烂代码,而上面这段话则精辟的总结了如何避免写出烂代码。

代理模式 简单实现

当我们不能或者不想直接访问某个对象或者方法,需要使用一个中间对象来访问这个对象的时候,就可以称之为代理模式。例如我们现在交电话费可以直接通过支付宝来支付,不用再去跑到营业厅支付。此时,支付宝平台实际就是一种代理,最后,它还是要把钱支付给电信公司。

var Money = function(amount) {
    this.amount = amount
};
var customer = {
    pay: function(target) {
        var money = new Money(50);
        target.receiveMoney(money.amount)
    }
}
var agent = {
    receiveMoney: function(amount) {
         mobileCompanies.receiveMoney(amount)
    }
}
var mobileCompanies = {
    receiveMoney: function(amount) {
        alert("缴费成功,您成功缴费"+amount+"元")
    }
} 
customer.pay(agent)  // 50
保护代理和虚拟代理 保护代理

通过中间的代理层我们可以过滤掉一些请求,比如可以校验用户的账户的有效性,对于一些无效的缴费请求可以直接在这里就过滤掉。这样的代理模式称之为保护代理,即控制对实体的访问频率,例如当我们有一个接口请求的数据量很大,访问量也很大的时候,可能就需要严格控制对这个接口的访问,但是同时我们又不想更改这个函数的代码,增加校验代码,这时就可以通过保护代理模式。

保护代理用于控制不同权限的对象对目标对象的访问。

虚拟代理

虚拟代理把一些开销很大的对象,延迟到真正需要它的时候才去创建。

虚拟代理实现图片与加载
当图片过大或者网络状况不佳的情况下,图片往往有一段时间是空白的,常用的解决方案是先用一个loaging占位,待图片加载完成的时候再把它填充到img节点里面。

var imageNode = (function(){
    var imgNode = document.createElement("img")
    document.getElementById("testImg").appendChild(node)
    return {
        setSrc: function(src) {
            imgNode.src =  src
        }
    }
})()
var agent = (function(){
    vat image = new Image()
    image.onLoad = function() {
        imageNode.setSrc(this.src)
    }
    return {
        setSrc: function(src) {
            imageNode.setSrc("C:/user/test.gif")
            img.src = src
        }
    }
})()
agent.setSrc("http://test.com/test.jpg")
代理的意义

根据单一指责原则,就一个类或则方法而言,应该仅有一个使它变化的原因。如果一个类或者方法承担了多项职责,不止意味着它变的很大,同时引起它变化的原因也会很多。比如上面的方法中,图片的预加载只是一种锦上添花的效果,如果有一天我们不再需要预加载的时候,我们不需要改变imgNode对象。所以代理即隔离了变化的部分,即预加载功能,又能在适当的时候调用,即加载完成,当然在代理中间还可以有很多其他的操作,正是如开头所说的,将变化的部分封装起来,将不变的地方抽取出来。

主要参考《JavaScript设计模式与开发实践》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79278.html

相关文章

  • PHP设计模式代理模式

    摘要:虚拟代理如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。 概念 代理模式(Proxy Pattern) :一种对象结构型模式。给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 UML showImg(https://seg...

    zhisheng 评论0 收藏0
  • 设计模式代理模式

    摘要:代理模式的定义来源于百度百科为其他对象提供一种代理以控制对这个对象的访问。二来源大话设计模式三例子实现现在根据上面购票代理的场景来实现例子接口,定义真实火车站,还有代理提供的服务。一、定义       在网络不发达之前,我们买火车票,通常都需要跑到火车站去买。这对于我们来说可能有些麻烦,偶然有一天,你发现你楼下有一家便利店居然能买火车票,这就方便很多。其实啊,便利店并不提供火车服务,也没有权...

    enda 评论0 收藏0
  • Spring框架我见(二)——代理模式

    摘要:聊完了工厂模式,下面我们来说框架中的另一个核心设计模式代理模式。这里的外卖小哥就相当于是我们的代理。主要分为代理和代理。 聊完了工厂模式,下面我们来说Spring框架中的另一个核心设计模式——代理模式(Proxy Pattern)。 代理模式 大家可以先不用看概念,先举个吃饭的例子:比如说我们想吃饭,我们可以选择自己做饭吃、去饭店吃、叫外卖吃。如果我们选择自己做着吃,我们就需要去买菜、...

    oneasp 评论0 收藏0
  • Javascript设计模式——代理模式

    摘要:最近在读设计模式与开发实践,在这里把文中的各种设计模式写出来,以便加深记忆,也可以分享给初学者。经纪人可以全权代表明星和客户谈判,最后把谈判结果给明星,明星决定签约与否。这也违反了面向对象设计原则中的单一职责原则。 最近在读《javascript设计模式与开发实践》,在这里把文中的各种设计模式写出来,以便加深记忆,也可以分享给初学者。如果你不了解设计模式,那么强烈推荐你阅读一下这本书,...

    cuieney 评论0 收藏0
  • JS设计模式代理模式

    摘要:什么是代理模式代理模式,类似于明星的经纪人,想要拜访明星,需要先通过经纪人的沟通。不同于装饰器,那种动态加载一个对象,可以说在代理模式当中,代理是早已既定的。又称单一功能原则,面向对象五个基本原则之一。 什么是代理模式 代理模式,类似于明星的经纪人,想要拜访明星,需要先通过经纪人的沟通。而在JS当中,如果想访问一个类,需要通过另一个类来间接访问 。不同于装饰器,那种动态加载一个对象,可...

    widuu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<