什么是JavaScript“代理模式”?

时间:2011-09-11 16:47:51

标签: javascript

我今天在jQuery.com上遇到过'代理模式'的概念,但是无法做出任何改变。显然它很有用,但我根本不理解这个想法,这对我来说听起来很陌生。有人可以用简单的语言向我解释,“好像我是一个3岁的孩子”?

5 个答案:

答案 0 :(得分:41)

想象一下,您的网站上有很多ajax请求。设计有所改变。现在每个请求之前你想要显示一些自定义加载gif。您需要更改存在ajax请求的所有代码,或者您可以使用代理模式。

var proxied = jQuery.ajax; // Preserving original function
jQuery.ajax = function() { 
    jQuery("#loading").dialog({modal: true});
    return proxied.apply(this, arguments);
}

答案 1 :(得分:24)

在Javascript Patterns一书中,Stoyan Stefanov将这种模式描述为:

  

在代理模式中,一个对象充当另一个对象的接口。代理位于对象的客户端和对象本身之间,并保护对该对象的访问。

这种模式可能看起来像是开销,但它对于性能目的很有用。代理服务器扮演对象的监护角色(也称为“真实主题”),并尝试使该对象尽可能少地工作。

一个真实世界的例子

当真正的主题做了昂贵的事情时,代理模式很有用。在网络上 应用程序,您可以执行的最昂贵的操作之一是网络请求,所以 尽可能多地组合HTTP请求是有意义的。

您可以在此处查看示例:http://www.jspatterns.com/book/7/proxy.html。 (看看源代码)。

您在页面上有一个视频列表。当用户点击视频标题时,该区域 标题下方展开以显示有关视频的更多信息,并启用 要播放的视频。详细的视频信息和视频的URL不是 页面的一部分;需要通过进行Web服务调用来检索它们。网络服务 可以接受多个视频ID,因此我们可以通过缩减来加快应用程序的速度 尽可能使用HTTP请求,并一次检索多个视频的数据。

视频对象不会直接调用 HTTP 服务,而是调用代理。然后代理在转发请求之前等待。如果来自视频的其他来电在50毫秒的等待期内进入,则它们将合并为一个。用户几乎察觉不到50毫秒的延迟,但是当点击“切换”并一次扩展多个视频时,可以帮助组合请求并加快体验。它还显着降低了服务器负载,因为Web服务器必须处理较少数量的请求。

没有代理

Without proxy

<强> 代理

With Proxy

代理作为缓存

As a cache

答案 2 :(得分:4)

通常 - 代理模式来控制对资源的访问。通过这样做,它可以解决几个潜在的问题:

  1. 防止错误或恶意使用资源
  2. 阻止/控制对创建过于昂贵的资源的访问
  3. jQuery使用这个术语相当松散,但他们的想法是你在覆盖/隐藏现有方法(在他们的示例中为jQuery.fn.setArray),同时为其添加更多功能。

    (function() { // envelop everyting in anonymous immediately called function 
      var proxied = jQuery.fn.setArray; // save current method
      jQuery.fn.setArray = function() { // override the method
        console.log(this, arguments); // add functionality
        return proxied.apply(this, arguments); // call original method and return 
                                               // its result
      };
    })();
    

答案 3 :(得分:0)

以下是用于记录正在设置的侦听器的代理模式的一个示例:Why does Google +1 record my mouse movements?

答案 4 :(得分:0)

代理模式为另一个对象提供代理或占位符对象,并控制对该另一个对象的访问。

在面向对象的编程中,对象通过它们的接口(属性和方法)完成它们所做的工作。这些对象的客户希望这项工作能够快速有效地完成。但是,在某些情况下,对象受到严格限制,无法履行其职责。通常,当存在对远程资源的依赖性(导致网络延迟)或对象需要很长时间才能加载时,会发生这种情况。

在这些情况下,您应用代理模式并创建一个代表原始对象的代理对象。代理将请求转发给目标对象。 Proxy对象的接口与原始对象相同,客户端可能甚至不知道他们正在处理代理而不是真实对象。

enter image description here

客户端 - 在示例代码中:run()函数

  • 调用Proxy来请求操作。

代理 - 示例代码:GeoProxy

  • 提供类似于真实对象的界面

  • 维护一个让代理访问真实对象的引用

  • 处理请求并将这些请求转发给真实对象

RealSubject - 示例代码:GeoCoder

  • 定义请求服务的真实对象