~;}"l$m&~3g3Kk*VB0 网上关于JAVA的适配器模式例子有很多,但真的有少实在不怎么样,看也不懂。自己总结了一个在性能和结构上都很容易理解的Adapter模式。51Testing软件测试网+H4]6ZC'b\)o'd&g
EM l
(A@5W'rmW+\zN0 Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种。Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式。
MV oR^Ii+d051Testing软件测试网v'g"A|C? a/m 在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:
c^%}F3q051Testing软件测试网I!U9L%wF)A$e.H$dd
我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件,如果我们自己重新开发这些功能会花费大量时间;所以很多情况下会选择先暂时使用外
部组件,以后再考虑随时替换。但这样一来,会带来一个问题,随着对外部组件库的替换,可能需要对引用该外部组件的源代码进行大面积的修改,因此也极可能引
入新的问题等等。如何最大限度的降低修改面呢?51Testing软件测试网CF`p&\
Eic(`
51Testing软件测试网|4]5r
hLq Adapter模式就是针对这种类似需求而提出来的。
`5D!yC@&_c6q051Testing软件测试网;d4\G3V6j"r5N Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响。
}8SB ~P
i{051Testing软件测试网#M7y:|e[+d0Ut;Z(c/p 实现Adapter模式的2种方法与范例
1y_z`'zb051Testing软件测试网M^ B'p@7aL Adapter模式通过在Adapter类中调用外部组件来实现功能。51Testing软件测试网
NUk(G/]E-s
51Testing软件测试网 ds+m m;R 根据调用方式的不同,Adapter模式有2种实现方法:51Testing软件测试网Ma7kl)k'qa
.U(C|*BRZm0 1、通过继承实现Adapter51Testing软件测试网y.^:d:d0K_]
51Testing软件测试网CA9gb:hv 2、通过委让实现Adapter51Testing软件测试网V9r7j8hM Q~
,Br?-Wa0 为了能更清楚地说明2种实现方法的区别,我们举例说明:
d"PeUPpvAA(Ke0al;W!yKf'Z0 比如,我们需要实现一个发送邮件的功能,需要用到一个名为OutMailer的外部组件,因为上述原因,我们决定用Adapter模式实现对OutMailer的透明调用。
y%Y_Y#MLx0xZ
[+j7|.{|*r0 首先,我们把邮件发送的功能抽象成一个接口:51Testing软件测试网3d\(TeH/A_)z
- IMailer.java
- interface IMailer {
-
- publicvoid sendMail();
- }
|
?*E4C"[^0 然后定一个实现IMailer接口的MailerAdapter类。
vK{]&]0A5KH3n051Testing软件测试网(bp1?
i:C3K 下面我们来看看MailerAdapter的实现方法。51Testing软件测试网{]*k)VSG0o
g7wg#c%?F2F0 通过继承实现Adapter51Testing软件测试网| O8^8T6Su:s
51Testing软件测试网:B} V'N$xT-J
h1S MailerAdapter.java51Testing软件测试网\*\7OHL
- class MailerAdapter extends OutMailerimplements IMailer {
-
- publicvoid sendMail() {
-
- this.sendMail();
- }
!S \3l[7d)z0-
- }
|
51Testing软件测试网K n,|V,Vxy;o"{9q 通过委让实现Adapter51Testing软件测试网F(tbjq,m
v$x$}
lf@2\0 MailerAdapter.java51Testing软件测试网Cf/jwFQ9R7N
- class MailerAdapter implements IMailer {
- private OutMailer outMailer =new OutMailer();
-
- publicvoid sendMail() {
-
- outMailer.sendMail();
- }
- 51Testing软件测试网:ZE(c:lWu7y
-
- }
|
(y/O6KkjH0 不管是通过继承实现Adapter,还是通过委让实现Adapter,调用方MailerClient的调用方法完全一样,如下:
:nK+Q5U$Z&L&t/s0/k-hZ:Iy+b fQJ%E-`^E0 MailerClient.java51Testing软件测试网].xh@q8Y0r
|w'j
- IMailer mailer =new MailerAdapter();
- ...
- mailer.sendMail();
|
51Testing软件测试网Pl"E{i5X?#WC 我们可以看到,这里完全没有直接调用OutMailer,也就是说OutMailer即使被替换了,我们也不用对MailerClient做任何修改。51Testing软件测试网3\/`/UU+b
k