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

有一天,我将设计模式中的代理模式和咱们社会中的代理机构联系起来。发现他们之间有很是多的类似的地方,并且能够互相借鉴。设计模式

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

对比并不必定是一件快乐的事,可是对比和讨论每每能够帮助咱们加深对原有思想的理解。缓存

社会中的代理机构

咱们先来讲说咱们生活中的代理。咱们何时才会遇到代理呢?好比租房代理/商标注册代理/法律代理等等。这和理解设计模式同样,须要先看看模式的目的,也就是代理这种社会现象存在的价值所在了。ide

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

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

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

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

设计模式中的代理模式

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

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能够继续作其它事情。

扩展开来。之后若是咱们的系统都在并行模式中开发的话,奠基一些基于并行的模式,对咱们软件工程的发展很是有利。

总结

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

相关文章
相关标签/搜索