`
ruilin215
  • 浏览: 1148166 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

代理(Proxy)模式 vs. 代理(Agency)机构

阅读更多

有一天,我将设计模式中的代理模式和我们社会中的代理机构联系起来。发现他们之间有非常多的相似的地方,而且可以互相借鉴。

在讨论这个话题之前,我的老板就率先指出了我的缺点。代理是Proxy不是Agency。Proxy一般指协议,和生活中的代理机构Agent是不一样的哦。不过我想说的是,所以我们才应该感叹中国汉语之博大精深,以及设计模式翻译的如何巧妙了。

对比并不一定是一件快乐的事,但是对比和讨论往往可以帮助我们加深对原有思想的理解。

社会中的代理机构

我们先来说说我们生活中的代理。我们什么时候才会遇到代理呢?比如租房代理/商标注册代理/法律代理等等。这和理解设计模式一样,需要先看看模式的目的,也就是代理这种社会现象存在的价值所在了。

就比如说贷款,特别是住房公积金贷款,这项任务,既复杂,也好时间,简单点说就是麻烦。所以这项工作对应的代理就有了成长的土壤。他们帮助我们完成这件事,条件是从中抽取一部分佣金。

可见社会中的代理模式是这样的。

你--〉代理--〉办事机构

并且我们可以注意到一个现象,办同一件事的代理并不是只有一家,而且就算一家,也不止有一个代理人员。但是行业只要足够成熟,他们对你的办事方式方法都是统一的,所以你关心的不是那个代理能不能办成事,而是用这个代理的成本高不高。当然了,如果要考虑欺诈行为,那么成本就更高了。另外,一个代理可以为不同人进行代理,这点是最重要的,正是因为有这个原因,才让代理机构可以营利。

设计模式中的代理模式

好了,介绍完了之后,我们再看看设计模式中介绍的代理模式。为了忠实他的牙原有思想,我采用设计模式中的介绍方式来说明代理模式。

PROXY模式在《设计模式-可复用面向对象软件的基础》中归类为结构型模型。以下是引用自此书的中文翻译版。

  1. 意图:为其他对象提供一种代理以控制对这个对象的访问。
  2. 动机:对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。...问题的解决分方案时使用另一个对象,...,替代那个真正的...
  3. 结构:...运行时刻的一种可能的代理结构的对象图。aClient->aProxy->aRealSubject
  4. 效果:一种优化方式:copy-on-write

补充一下,Windows系统中,浏览器中的预览图片,也可以看成是一种代理模式,这样可以减少对实际图片装载的开销。

对比

意图对比:显然两方面都是一样的,社会中的代理结构,就是为了为客户提供一种代理。有一个很有意思的细节,如果我们仔细考虑一下,就会发现,我们以前在考虑代理模式的时候,一般是从整体考虑的,并没有足够考虑模式中每一个对象的细节需求。可以说,我们理想中的对象都是只有付出,没有赚取的。品格都是比较高尚的。但在社会中,每一个对象都是由自己的利益所在的。虽不能说无利而不往,但是很多存在的现象,都是因为相互有利可图。

动机对比:设计模式中对动机的描述,有点太晦涩了。这里面我们会发现很多有意思的问题。我相信这在我们理解这俄模式的时候,也经常在困扰我们。

一个典型的问题是:谁代理谁?代理是代理被访问的对象,还是代理客户对象?在现实社会中,往往是客户对象认为自己去做的成本太高,所以雇佣代理机构去完成。但在设计模式中,我们看到调用方向和社会模式中的方向不一样。这一点非常奇怪。我也是理解了很久,和大家又讨论了一番,才感觉比较理解这个差异了。

造成这个问题的原因是因为我刚才提到的。我们在讨论纯软件设计的时候,可能会忽略动机是系统的需求还是个体的需求。现实生活中,一般都是个体需求,理论中一般都是系统需求。虽然不能说谁对谁错,可以肯定的是,关键在于从谁的角度去考虑这个问题,或者是谁来解决问题。

这点如果用我们现实生活中的话更容易理解。很多时候,不在于事情谁来做最合适,而在于谁做了。如果总是在几个“应该”做的部门之间互相踢皮球,受伤的是整个社会!所以在系统设计中,关键在于解决这个问题,至于这个解决问题的能力归属于谁,我认为不是太重要。当然了,如果考虑了更好!

结构对比:这点在说动机对比的时候,其实已经涉及到了。关键在于方向刚好相反!不管怎么样,代理的地位是一样的。

效果对比:这个对比其实有点无聊。不过可以看出系统和社会一样,当访问一个对象成本较高的时候,缓存的机制就会提出。Delphi语言中String的copy-on-write技术实现,浏览器中的Cach技术。这些我们以前可以认为是叫缓存技术的,不严格的话,都和代理模式效果一致。

语言对比:Proxy和Agent。我个人认为Proxy来命名模式,容易让人误解,还不如叫Agent模式。这样更容易让人理解。至少很多英语不是很强的中国人对Proxy的理解容易出偏差。另外,此模式的结构和现实生活也有所差异,这点也让很多人容易误解。

借用

再来看看我们社会模式中代理结构。假象我们作为一个客户,当你要雇佣代理机构的时候,往往是因为某些事情比较复杂。而一旦你将事情委托出去了。你就会很自然地说这样的话:“那好,你们就做吧,有什么事情再找我”。于是你就开始忙自己的事情去了。从这一点看,代理有可以让事情并行处理的好处。

回到Proxy模式,我建议,可以扩展这样的模式,在原有模式上,增加并行处理的流程。Proxy可以在某些方法执行之后,通知Client继续处理。否则,Client可以继续做其它事情。

扩展开来。以后如果我们的系统都在并行模式中开发的话,奠定一些基于并行的模式,对我们软件工程的发展非常有利。

总结

这个对比,并不是无聊之极的联想,事实上,我本人就从上面对原有的模式有了更深的理解。这个就是代码大全里面曾经提到的“隐喻”的概念。我所想表达的不光是相同的,更重要的是那些不同的地方,比较相同点可以让我们认识更清晰,而比较不同点,可以让我们学到更多!

分享到:
评论

相关推荐

    proxy.jsp、proxy.ashx、proxy.php、proxy.config

    **proxy.config** 是代理服务的配置文件,通常用于存放需要代理的服务列表或者设置其他高级选项。在ASP.NET的`proxy.ashx`中,这个文件可能包含对哪些URL进行代理的规则,以及认证信息等。对于Java和PHP版本的代理,...

    test_proxy_server.zip

    httpProxy.createProxyMiddleware({ target: 'http://your-backend-api.com', changeOrigin: true, }) ); app.listen(3000, () => { console.log('Proxy server is running on port 3000'); }); ``` 这段代码...

    代理模式 proxy-learn.rar

    3. **创建动态代理对象**:使用`Proxy.newProxyInstance()`方法创建动态代理对象。 ```java Service realService = new RealService(); Service proxyService = (Service) Proxy.newProxyInstance( Service.class....

    设计模式之代理模式proxy.zip

    JDK动态代理基于接口实现,它要求目标对象必须实现至少一个接口,然后通过Proxy类和InvocationHandler接口来创建并控制代理对象。当我们调用代理对象的方法时,实际执行的是InvocationHandler的invoke方法,这样可以...

    apache代理mod_proxy、mod_proxy_http代理模块库包下载(32位windows\linux版本).txt

    该软件包是apache的httpd中mod_proxy.so、mod_proxy_http.so代理模块,分别对应包含linux、windows的版本。

    ftpproxy-1.2.3.rar_Linux c proxy_ftpproxy_ftp代理_linux ftp_proxy-

    proxy源代码,linux下的ftp 代理的源代码,大家多多支持啊

    arcgis proxy.ashx,proxy.config

    arcgis for javascript api所需要的配置文件,能解决跨域访问的问题,我在proxy....包含两个文件proxy.ashx,proxy.config两个文件,上次下载一个说是有两个文件,其实里面只有一个,有被骗了的感觉,所以这次上传上来

    Node.js代理中间件http-proxy-middleware.zip

    http-proxy-middleware 是一套 Node.js 代理中间件 for connect, express 和 browser-sync。安装$ npm install --save-dev http-proxy-middleware配置var proxyMiddleware = require('http-proxy-middleware'...

    proxy.conf.json

    proxy file

    开源项目-BlueDragonX-go-proxy-example.zip

    开源项目-BlueDragonX-go-proxy-example.zip,go中的tcp代理示例

    救活HiSuite Proxy的方法.docx

    - HiSuite Proxy是一种允许用户通过代理服务器来操作手机固件的工具,主要用于降级等场景。 - 正常情况下,用户通过HiSuite连接手机后,可以从华为的官方服务器下载相应的固件进行安装或更新。 - 当华为更改固件...

    proxy-demo.zip

    - 可能还有一个动态代理类(DynamicProxy),使用了`Proxy.newProxyInstance()`方法来创建代理对象,并实现了`InvocationHandler`接口,用于处理接口方法的调用。 此外,压缩包可能还包含测试类(Test)来展示如何...

    ArcGis代理.Net版本proxy.ashx

    《ArcGIS代理.Net版本proxy.ashx详解及应用》 ArcGIS代理(ArcGIS Proxy)是一种重要的GIS(地理信息系统)技术,它在.NET环境中实现,主要用于处理跨域访问限制问题,尤其是在ArcGIS服务与Web应用程序交互时。标题...

    mod_proxy_ajp.so

    apache服务器和tomcat服务器之间实现URL代理的module.so工具类文件

    PyPI 官网下载 | foxyproxy-2.3.1.tar.gz

    2. **分布式**:此标签意味着foxyproxy可能设计用于处理分布式环境中的问题,如跨多台服务器或节点的代理配置,或者是能够处理分布式数据流和通信的工具。 3. **云原生**:云原生(Cloud Native)指的是在云环境中...

    Charles.Proxy.3.5.2.Mac(已破解)

    mac系统下的charles版本,保证可用,使用期间,请忽略最新版本的更新提示。 支持AMF、http、html、JS、CSS、raw等网络抓包。 对web程序员及web测试员来说,是一大利器,可以帮助寻找各类错误。 ...

    TCP代理服务器proxy-server.zip

    proxy-server 是基于swoole开发的纯异步多进程TCP代理服务器,可支持超大量并发。可完美利用多核,性能强劲。...php proxy.php压力测试ab -c 1000 -n 100000 -k http://127.0.0.1:9509/ 标签:proxy

    设计模式C++学习之代理模式(Proxy)

    代理模式是一种设计模式,它是结构型模式之一,主要用于在客户端和目标对象之间建立一个代理对象,以便控制对目标对象的访问。在C++中,代理模式可以用来为其他对象提供一种代理以控制对这个对象的访问,或者增加...

    C#面向对象设计模式纵横谈\13 结构型模式Proxy代理模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源... 这是第13节:结构型模式Proxy代理模式

Global site tag (gtag.js) - Google Analytics