扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
有一天,我将设计模式中的代理模式和我们社会中的代理机构联系起来。发现他们之间有非常多的相似的地方,而且可以互相借鉴。
在讨论这个话题之前,我的老板就率先指出了我的缺点。代理是Proxy不是Agency。Proxy一般指协议,和生活中的代理机构Agent是不一样的哦。不过我想说的是,所以我们才应该感叹中国汉语之博大精深,以及设计模式翻译的如何巧妙了。
对比并不一定是一件快乐的事,但是对比和讨论往往可以帮助我们加深对原有思想的理解。
我们先来说说我们生活中的代理。我们什么时候才会遇到代理呢?比如租房代理/商标注册代理/法律代理等等。这和理解设计模式一样,需要先看看模式的目的,也就是代理这种社会现象存在的价值所在了。
就比如说贷款,特别是住房公积金贷款,这项任务,既复杂,也好时间,简单点说就是麻烦。所以这项工作对应的代理就有了成长的土壤。他们帮助我们完成这件事,条件是从中抽取一部分佣金。
可见社会中的代理模式是这样的。
你--〉代理--〉办事机构
并且我们可以注意到一个现象,办同一件事的代理并不是只有一家,而且就算一家,也不止有一个代理人员。但是行业只要足够成熟,他们对你的办事方式方法都是统一的,所以你关心的不是那个代理能不能办成事,而是用这个代理的成本高不高。当然了,如果要考虑欺诈行为,那么成本就更高了。另外,一个代理可以为不同人进行代理,这点是最重要的,正是因为有这个原因,才让代理机构可以营利。
好了,介绍完了之后,我们再看看设计模式中介绍的代理模式。为了忠实他的牙原有思想,我采用设计模式中的介绍方式来说明代理模式。
PROXY模式在《设计模式-可复用面向对象软件的基础》中归类为结构型模型。以下是引用自此书的中文翻译版。
补充一下,Windows系统中,浏览器中的预览图片,也可以看成是一种代理模式,这样可以减少对实际图片装载的开销。
意图对比:显然两方面都是一样的,社会中的代理结构,就是为了为客户提供一种代理。有一个很有意思的细节,如果我们仔细考虑一下,就会发现,我们以前在考虑代理模式的时候,一般是从整体考虑的,并没有足够考虑模式中每一个对象的细节需求。可以说,我们理想中的对象都是只有付出,没有赚取的。品格都是比较高尚的。但在社会中,每一个对象都是由自己的利益所在的。虽不能说无利而不往,但是很多存在的现象,都是因为相互有利可图。
动机对比:设计模式中对动机的描述,有点太晦涩了。这里面我们会发现很多有意思的问题。我相信这在我们理解这俄模式的时候,也经常在困扰我们。
一个典型的问题是:谁代理谁?代理是代理被访问的对象,还是代理客户对象?在现实社会中,往往是客户对象认为自己去做的成本太高,所以雇佣代理机构去完成。但在设计模式中,我们看到调用方向和社会模式中的方向不一样。这一点非常奇怪。我也是理解了很久,和大家又讨论了一番,才感觉比较理解这个差异了。
造成这个问题的原因是因为我刚才提到的。我们在讨论纯软件设计的时候,可能会忽略动机是系统的需求还是个体的需求。现实生活中,一般都是个体需求,理论中一般都是系统需求。虽然不能说谁对谁错,可以肯定的是,关键在于从谁的角度去考虑这个问题,或者是谁来解决问题。
这点如果用我们现实生活中的话更容易理解。很多时候,不在于事情谁来做最合适,而在于谁做了。如果总是在几个“应该”做的部门之间互相踢皮球,受伤的是整个社会!所以在系统设计中,关键在于解决这个问题,至于这个解决问题的能力归属于谁,我认为不是太重要。当然了,如果考虑了更好!
结构对比:这点在说动机对比的时候,其实已经涉及到了。关键在于方向刚好相反!不管怎么样,代理的地位是一样的。
效果对比:这个对比其实有点无聊。不过可以看出系统和社会一样,当访问一个对象成本较高的时候,缓存的机制就会提出。Delphi语言中String的copy-on-write技术实现,浏览器中的Cach技术。这些我们以前可以认为是叫缓存技术的,不严格的话,都和代理模式效果一致。
语言对比:Proxy和Agent。我个人认为Proxy来命名模式,容易让人误解,还不如叫Agent模式。这样更容易让人理解。至少很多英语不是很强的中国人对Proxy的理解容易出偏差。另外,此模式的结构和现实生活也有所差异,这点也让很多人容易误解。
再来看看我们社会模式中代理结构。假象我们作为一个客户,当你要雇佣代理机构的时候,往往是因为某些事情比较复杂。而一旦你将事情委托出去了。你就会很自然地说这样的话:“那好,你们就做吧,有什么事情再找我”。于是你就开始忙自己的事情去了。从这一点看,代理有可以让事情并行处理的好处。
回到Proxy模式,我建议,可以扩展这样的模式,在原有模式上,增加并行处理的流程。Proxy可以在某些方法执行之后,通知Client继续处理。否则,Client可以继续做其它事情。
扩展开来。以后如果我们的系统都在并行模式中开发的话,奠定一些基于并行的模式,对我们软件工程的发展非常有利。
这个对比,并不是无聊之极的联想,事实上,我本人就从上面对原有的模式有了更深的理解。这个就是代码大全里面曾经提到的“隐喻”的概念。我所想表达的不光是相同的,更重要的是那些不同的地方,比较相同点可以让我们认识更清晰,而比较不同点,可以让我们学到更多!
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者