适配器模式 (Adapter pattern)[GOF95] 是把一个类的接口换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能在一起工作。适配器主要有两种,一种使类的适配器,另一种使对象的适配器。
此模式涉及的角色:
1.类的适配器---主要使用继承来把类、接口等组合到一起,使其符合目标接口,类图如下:
源码:
/** * 目标角色, 相当于我们的应用程序, operation1是我们开放给客户的口 * */ public interface Target { public void operation1(); } /** * 源角色,相当于第三方库 * */ public class Adaptee { public Adaptee() { } public void operation2() { System.out.println("Adaptee.sampleOperation2()"); } } /** * 适配器角色 * 把第三方库的接口operation2转化为我们开放给客户的接口operation1 * */ public class Adapter extends Adaptee implements Target { public void sampleOperation1() { this.sampleOperation2(); } } /** * 客户端类 * */ public class Client { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); Target target = new Adapter(); target.sampleOperation1(); } }
2.对象的适配器---对于类的适配器是通过继承来实现,而对于对象的适配器则是通过对象组合来实现。类图如下:
示例代码:
/** * 目标角色 相当于我们的应用程序, sampleOperation1是我们开放给客户接口 * */ public interface Target { public void sampleOperation1(); } /** * 源角色,相当于第三方库 * */ public class Adaptee { public Adaptee() { } public void sampleOperation2() { System.out.println("Adaptee.sampleOperation2()"); } } /** * 适配器角色 * 把第三方库的接口operation2转化为我们开放给客户的接口operation1 * */ public class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { super(); this.adaptee = adaptee; } public void sampleOperation1() { adaptee.sampleOperation2(); } } /** * 客户端类 * */ public class Client { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); Target target = new Adapter(adaptee); target.sampleOperation1(); } }
3.适配器模式的应用
我们通过Hibernate来说明。Hibernate通过数据库连接池ConnectionPool来连接数据库,java程序通过hibernate来访问数据库。ConnectionPool的主要作用就是提供数据库连接。在Hibernate中,对数据库连接池进行了抽象,用ConnectionProvider接口作为连接池的接口,另外它还提供了连接池的实现类DriverManagerConnnectProvider,这是hibernate默认的连接池,此外Hibernate还可以使用第三方提供的连接池,如dbcp和c3p0,但是这些第三方的各有自己的API,他们并没有实现ConnectionProvider接口,所以Hibernate必须想办法解决,适配器模式来啦,看图;
hibernate只会访问ConnectionProvider接口,DBCPConnectionProvider和C3P0ConnnectionProvider为适配器,他们分别负责吧DBCP和C3P0连接池转换为ConnectionProvider接口。