起初对这两个模式感兴趣,主要是因为在Ice中,反复提到了这两个模式。而由于Ice编程确实让开发人员很容易上手,所以我觉得这两个模式非常的好。所以今天好好的学习一下。
Adapter适配器模式和Proxy代理模式都是属于结构型设计模式的范畴。结构型设计模式是从程序的结构上解决模块之间的耦合问题。从代码的角度看Adapter适配器模式和Proxy代理模式有些类似,Adapter适配器模式是解决现有对象在新的环境中的不足,而Proxy代理模式是解决直接访问对象时出现的问题,这两种模式从使用角度看都是解决直接访问对象时出现的问题,只是含义不十分相同。
网上有两个例子,分别从直观面上说明了这两个模式。
适配器:说通俗点就是把一个东西包装一下变成另外一个东西,为什么要包装而不直接就用这个东西呢?呵呵,如果能直接用就犯不着适配了,要适配当然就是由于某些原因你用不了当前这个东西。最容易理解的就是电器的例子,比如你在中国买的电器使用电压是220V,结果你跑到国外去了,国外提供的电压是110V,问题就来了,你必须使用的是220V的,国外提供给你的却只有110V的,所以你根本就用不了,除非你能够将110V的转化成为220V才能行。此时适配器就排上用场了,你使用一个转压器不就可以把110V专成220V了吗?
代理:假设你有一套房子要卖,一种方法是你直接去网上发布出售信息,然后直接带要买房子的人来看房子、过户等一直到房子卖出去,但是可能你很忙,你没有时间去处理这些事情,所以你可以去找中介,让中介帮你处理这些琐碎事情,中介实际上就是你的代理。本来是你要做的事情,现在中介帮助你一一处理,对于买方来说跟你直接交易跟同中介直接交易没有任何差异,买方甚至可能觉察不到你的存在,这实际上就是代理的一个最大好处。
接下来我们再深入考虑一下为什么你不直接买房子而需要中介?其实一个问题恰恰解答了什么时候该用代理模式的问题。
原因一:你可能在外地上班,买房子的人没法找到你直接交易。
对应到我们程序设计的时候就是:客户端无法直接操作实际对象。那么为什么无法直接操作?一种情况是你需要调用的对象在另外一台机器上,你需要跨越网络才能访问,如果让你直接coding去调用,你需要处理网络连接、处理打包、解包等等非常复杂的步骤,所以为了简化客户端的处理,我们使用代理模式,在客户端建立一个远程对象的代理,客户端就 象调用本地对象一样调用该代理,再由代理去跟实际对象联系,对于客户端来说可能根本没有感觉到调用的东西在网络另外一端,这实际上就是Web Service的工作原理。另一种情况虽然你所要调用的对象就在本地,但是由于调用非常耗时,你怕影响你正常的操作,所以特意找个代理来处理这种耗时情况,一个最容易理解的就是Word里面装了很大一张图片,在word被打开的时候我们肯定要加载里面的内容一起打开,但是如果等加载完这个大图片再打开Word用户等得可能早已经跳脚了,所以我们可以为这个图片设置一个代理,让代理慢慢打开这个图片而不影响Word本来的打开的功能。申明一下我只是猜可能Word是这么做的,具体到底怎么做的,俺也不知道。
原因二:你不知道怎么办过户手续,或者说除了你现在会干的事情外,还需要做其他的事情才能达成目的。
对应到我们程序设计的时候就是:除了当前类能够提供的功能外,我们还需要补充一些其他功能。最容易想到的情况就是权限过滤,我有一个类做某项业务,但是由于安全原因只有某些用户才可以调用这个类,此时我们就可以做一个该类的代理类,要求所有请求必须通过该代理类,由该代理类做权限判断,如果安全则调用实际类的业务开始处理。可能有人说为什么我要多加个代理类?我只需要在原来类的方法里面加上权限过滤不就完了吗?在程序设计中有一个类的单一性原则问题,这个原则很简单,就是每个类的功能尽可能单一。为什么要单一,因为只有功能单一这个类被改动的可能性才会最小,就拿刚才的例子来说,如果你将权限判断放在当前类里面,当前这个类就既要负责自己本身业务逻辑、又要负责权限判断,那么就有两个导致该类变化的原因,现在如果权限规则一旦变化,这个类就必需得改,显然这不是一个好的设计。
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
概要说明
Adapter模式:1. 意图
将一个类的接口转换成客户希望的另外一个接口. 解决接口不兼容问题.
2. 别名
包装器 Wrapper
想使用一个已经存在的类. 而它的接口不符合你的要求.
5. 结构
6. 参与者
Target
----客户需要的接口.
Adaptee
----已经存在的一个接口.这个接口需要适配.
Adapter
----对Adaptee和Target接口进行适配.
Proxy模式:
1. 意图
为其它对象提供一种代理以控制对这个对象的访问.
2. 别名
Surrogate
4. 适用性
远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表.
虚代理(Virtual Proxy) 柑桔需要创建开销很大的对象.
保护代理(Protection proxy) 控制对原是对象的访问.
智能指针(Smart Reference)
5. 结构
6. 参与者
Proxy
----保存一个被代理的实体的引用.通过该引用控制实际对象.
----提供一个与Subject相同的接口.这样代理就可以代替实体.
----控制对实体的存取.并可能负责创建和删除它.
----其它功能.
Subject
----定义了RealSubject和Proxy的共用接口. 这样就可以在使用RealSubject的地方
使用Proxy.
RealSubject
----定义Proxy所代表的实体.