`
ruilin215
  • 浏览: 1147907 次
  • 性别: 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可以继续做其它事情。

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

总结

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics