什么是JavaScript"代理模式"?

And*_*iga 37 javascript

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

Iva*_*van 41

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

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

  • ...或者你可以添加一个[`ajaxStart`](http://api.jquery.com/ajaxStart)处理程序...... (3认同)
  • 我意识到你试图展示"代理模式",但我只是说它可能是一个糟糕的例子,因为图书馆已经有了更好的方法来完成你的例子. (3认同)
  • 我从不直接使用jQuery或任何其他框架..总是有一个包装框架代码的适配器,所以我可以处理这样的更改.上面代码的目标是给出代理模式的示例用法 (2认同)

Ale*_*edo 24

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

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

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

一个现实世界的例子

当真实主体做了昂贵的事情时,代理模式很有用.在Web应用程序中,您可以执行的最昂贵的操作之一是网络请求,因此尽可能多地组合HTTP请求是有意义的.

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

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

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

没有代理

没有代理

代理

使用代理

代理作为缓存

作为缓存