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

在讨论这个话题之前,我的老板就率先指出了我的缺点。代理是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)模式 vs. 代理(Agency)机构相关推荐

  1. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  2. Java 代理(proxy)模式

    代理模式(Proxy Pattern) 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代 ...

  3. 当Android遇上设计模式之代理(Proxy)模式

    文章目录 1. 代理模式 1.1 代码实现 1.2 使用场景 2. 静态代理与动态代理 设计模式六大原则: 单一职责原则:就一个类仅有一个引起它变化的原因,即类承担的职责单一性: 开放封闭原则:类.模 ...

  4. 设计模式---代理(Proxy)模式

    1 定义 代理模式,为想要访问的对象创建一个代理,使访问原对象变为访问代理对象.代理模式可以提供非常好的访问控制.生活中最多的代理模式例子就是中介. 2 代理模式结构与实现 代理模式通用类图如下所示( ...

  5. Head First 设计模式 —— 13. 代理 (Proxy) 模式

    思考题 如何设计一个支持远程方法调用的系统?你要怎样才能让开发人员不用写太多代码?让远程调用看起来像本地调用一样,毫无瑕疵? P435 已经接触过 RPC 了,所以就很容易知道具体流程:客户端调用目标 ...

  6. 《研磨设计模式》chap11 代理proxy模式

    场景:需要查询所有用户数据,不能翻页都显示出来,只显示姓名,在需要的情况下,点击某个用户的姓名出现详细信息. 1. 正常编码:仅查询当前数据 public static void main(Strin ...

  7. 设计模式--代理(Proxy)模式

    模式定义 为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问 类图 要点总结 "增加一层间接层"是软件系统中对许多复杂问题的一种常见解决方法,在面向对象系统中,直接使用 ...

  8. C++设计模式之Proxy模式(代理模式)

    代理模式很容易理解,就是代替别人去做某一件事,打个比方,我们需要买水果,一般是去超市或者水果店买水果,很少有人去果园买水果,果园是生产水果的地方,但很少出售水果,在这里,水果店,超市就成了代理. 首先 ...

  9. 【java】深入分析Java反射-动态代理 proxy

    1.概述 转载:深入分析Java反射(四)-动态代理 [Java]Java 反射机制浅析 [Java]java代理 静态代理 动态代理 proxy [java]静态代理 proxy 2.动态代理的简介 ...

最新文章

  1. 深度学习实现NBA球星颜值打分完整案例(二)
  2. 使用WebStor快速检查你组织网络中的所有网站相关安全技术
  3. docker启动nginx,并挂载目录及docker容器中文乱码
  4. [转载] 杜拉拉升职记——15 1001个笑话
  5. Spring Boot——基于AOP的HTTP操作日志解决方案
  6. Tokenisation word segmentation sentence segmentation
  7. 20190810:存在重复(三种解法)
  8. 如何访问个人邮箱中的未读邮件
  9. Kmp算法(java)
  10. Android基础整合项目之节日群发助手
  11. 《数据结构与算法自学与面试指南》01-01:图灵奖得主尼古拉斯·沃斯
  12. 单身职场人士怎么利用晚上时间提高自己?
  13. 家事:庆祝父亲60岁生日
  14. 基于机器学习的敏感信息泄露治理探索
  15. 基于STM32的游戏平台,其二TETRIS
  16. 解决win10下栏不显示电池电量图标问题
  17. L1-012 计算指数 (5 分) C语言
  18. antdesignpro ProTable 搜索模式自定义搜索字段
  19. (转)Inno Setup入门(八)——有选择性的安装文件
  20. 程序员屌丝的出路在哪?

热门文章

  1. R语言 VAR 模型的方差分解
  2. Fiddler 关闭 HTTP protocal violations 弹出框
  3. 用户使用报告_2020年抖音用户画像报告[附下载] | 行业数据报告研读
  4. 向某个窗口发送按键消息(包括后台隐藏的窗口)
  5. 16. OP-TEE中的中断处理(二)------系统FIQ事件的处理
  6. C语言Windows下实现音乐播放器
  7. python 元组
  8. 2022-2028全球与中国药房管理系统市场现状及未来发展趋势
  9. omnetpp inet
  10. 爱立信财大气粗 华为错失马可尼