5vEizN$t0 网上关于JAVA的适配器模式例子有很多,但真的有少实在不怎么样,看也不懂。自己总结了一个在性能和结构上都很容易理解的Adapter模式。51Testing软件测试网aY]#}e~&G{!`
51Testing软件测试网G _4`)jIn%L,Cf6k Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种。Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式。51Testing软件测试网-gt2?Scf&{0M d
51Testing软件测试网 ]Z$c)j U._
w)R3T#e 在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:51Testing软件测试网%_Esxa*S+bY1^
51Testing软件测试网-H a.k2omXiD
~b$x
我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件,如果我们自己重新开发这些功能会花费大量时间;所以很多情况下会选择先暂时使用外
部组件,以后再考虑随时替换。但这样一来,会带来一个问题,随着对外部组件库的替换,可能需要对引用该外部组件的源代码进行大面积的修改,因此也极可能引
入新的问题等等。如何最大限度的降低修改面呢?51Testing软件测试网.T:g.}w2e
7m7I@x%J0 Adapter模式就是针对这种类似需求而提出来的。
s?Yk$^0tz!{v-{03v0z^P9YH*xd0 Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响。51Testing软件测试网4skXs(LN7a6P;d
C\^f-go3D$~t0 实现Adapter模式的2种方法与范例
LneR-zT
R(P051Testing软件测试网0n}Gx'^g:ROQ Adapter模式通过在Adapter类中调用外部组件来实现功能。51Testing软件测试网,x)mBJZ;h
Z7Zs*P.iS|/m(a0 根据调用方式的不同,Adapter模式有2种实现方法:51Testing软件测试网BbP%V#eg$H+L
51Testing软件测试网^LaC^3^m,f 1、通过继承实现Adapter51Testing软件测试网+u)jx+?O+P_7J.|
51Testing软件测试网piQFfF$nY 2、通过委让实现Adapter
Ji3tc2YKgc051Testing软件测试网Zr;q ?4bb&dJ*u 为了能更清楚地说明2种实现方法的区别,我们举例说明:51Testing软件测试网E-|m;@+X"C@$P*l
}&ka5ICkPM0 比如,我们需要实现一个发送邮件的功能,需要用到一个名为OutMailer的外部组件,因为上述原因,我们决定用Adapter模式实现对OutMailer的透明调用。51Testing软件测试网e/`$bA$RM ]
8}_M K#lG0 首先,我们把邮件发送的功能抽象成一个接口:51Testing软件测试网0RU$K,C@vc0s-|
- IMailer.java
- interface IMailer {
-
- publicvoid sendMail();
- }
|
51Testing软件测试网
z)qf*i;{
JOz 然后定一个实现IMailer接口的MailerAdapter类。
5`5u`\T051Testing软件测试网O0_j2p!`G
}(B 下面我们来看看MailerAdapter的实现方法。51Testing软件测试网koyY]!Y}d
"pR;D3V2p7Z*y!^0 通过继承实现Adapter51Testing软件测试网
d5o x _-_JB
8Yt}t!K3h%S!s0 MailerAdapter.java51Testing软件测试网F9o$r8hTtjI1|
- class MailerAdapter extends OutMailerimplements IMailer {
-
- publicvoid sendMail() {
-
- this.sendMail();
- }
F;y'p\)^pk0-
- }
|
51Testing软件测试网#{i&b^BQ 通过委让实现Adapter51Testing软件测试网[ I.]5Au'[1UCK
)qBmtpVb0 MailerAdapter.java
'|zn+LWVg+F0- class MailerAdapter implements IMailer {
- private OutMailer outMailer =new OutMailer();
-
- publicvoid sendMail() {
-
- outMailer.sendMail();
- }
- 51Testing软件测试网an/Cf']M
-
- }
|
jVj s%f'^0 不管是通过继承实现Adapter,还是通过委让实现Adapter,调用方MailerClient的调用方法完全一样,如下:51Testing软件测试网)U
w0B.`a'hl
z4W7~-GW C
m0 MailerClient.java51Testing软件测试网nZ#\'e2L@3l(K
- IMailer mailer =new MailerAdapter();
- ...
- mailer.sendMail();
|
51Testing软件测试网,gRvt I 我们可以看到,这里完全没有直接调用OutMailer,也就是说OutMailer即使被替换了,我们也不用对MailerClient做任何修改。
YC(q g*GE*n^0