Programming 版 (精华区)
发信人: Sun (大灯泡), 信区: SoftEng
标 题: [Design Pattern] Adapter
发信站: 哈工大紫丁香 (2001年03月24日19:16:24 星期六), 站内信件
发信人:Crystal_Y (小衲) 版面名称:SoftEng(970)
标 题:[Design Pattern] Adapter
发信站:中国科大BBS站 (Sat, 24 Mar 2001 14:05:13 )
标 记:精华
Adapter又叫Wrapper,后者是从结构上说的,还是前者好,因为它指出了
这个Pattern的目标。
一般情况是,你找到一个component,它本质上与你现在需要的东西是相符
的,但是它的接口和你已有的接口不符。修改component的源码,当然显得很
酷,但是修改后的component还能通用吗估计不能除非你先作一份拷贝,更何况
源码很可能根本就不存在。
那么我们用Adapter的两种方式来解决这个问题:
头文件总是会有的吧,那么扩充它,以满足我们的需要。在C++里,就是
继承,而且是多重继承,因为adapter不但要继承这个通用component(被叫做
adaptee)的属性,还要继承在目前系统(被叫做target)定义的接口属性。继承
有一个好处就是adapter可以重载adaptee的某些方法。
对象的组合,adapter继承自target,然后compose一个adaptee的对象。
这样的好处是它也adapt了adaptee的所有子类。
无论继承还是组合,目的都是让adapter能够访问adaptee的种种method,
在target规定的接口方法里,adapter通过转换处理等等操作,再去调用相应
的adaptee的方法,这些操作的难易取决于target与adaptee之间的相似程度。
以上Adapter的应用,发生在一个component已经实现以后。如果我们
倒过来换个角度看,在设计一个component的时候,为了提高它的
reusability,它需要适应各种情况,这些情况在将来是实际存在的(就
像一个component已经完成一样),而这个component的设计也是要不变的
(就像目前这个系统已经定义了的接口一样),此时外界成了adaptee,而
这个component成了target,如何应用Adapter模式来使得一个component能
被很好的复用呢?
首先,如上文所述,Adapter两种方式目的就是为了让adaptor能够访问
adaptee的种种method,那么我们需要抽取出adaptor的某些部分,这些部分将访
问adaptee的method。这个部分越小越好,它被叫做adaption interface,然后
有几种实现方法:
继承:component设计成抽象类,要在外界某种环境里用这个component,
必须继承它,然后就可以在子类里实现adaption interface,调用外界adaptee的
实际method来完成component的功能
组合:component把adaption interface完全交给另一个delegate object去
声明,并且相信它会由某个具体的delegate来实现。在实际情况中,delegate一
般就是外界某个对象(如果没有,继承一个就行)。
参数化:不懂,呵呵
(上面这些可能挺晦涩的,最好去看看GoF的例子,有关pluggable adapters)
所谓双向adapter,在C++里就是多重继承的意思,它使得这个adaptor不仅
能够被target很好地使用,还能够用在原先直接就可以用adaptee的地方。我对
这个没有什么感性认识,就不乱说了~
ORB中的一个重要概念,IDL Skeleton就是Adapter模式的运用,与它对应的
另一个概念,IDL Stub实现的则是模式Proxy。
URL http://202.38.79.111/GoF/pat4afs.htm
--
※ 来源: 中国科大BBS站 [bbs.ustc.edu.cn]
--
太阳当空照,灯泡呵呵笑,
mm说,早上好,你为什么又不理我了?
我要做光光,光光没烦恼,
高高跳,大声叫,光光的乐趣你们不知道!
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: sunner.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.624毫秒