适配器模式(Adapter)


       适配器模式 (Adapter pattern)[GOF95] 是把一个类的接口换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能在一起工作。适配器主要有两种,一种使类的适配器,另一种使对象的适配器。

 此模式涉及的角色:

  • 目标角色(Target):客户端所期待的接口(笔记本所期待的电压)。
  • 源角色(Adaptee):需要失配的接口(也就是客户端想使用这个功能,但是接口不对。如220v的电压)
  • 适配器(Adapter):你们中间加上我就可以“联通”了。haha...

1.类的适配器---主要使用继承来把类、接口等组合到一起,使其符合目标接口,类图如下:

              


适配器模式(Adapter)
 
 
 

 

   源码:

    

/**
 * 目标角色, 相当于我们的应用程序, 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.对象的适配器---对于类的适配器是通过继承来实现,而对于对象的适配器则是通过对象组合来实现。类图如下:
 
 



适配器模式(Adapter)
 
 

 

示例代码:

 /**
 * 目标角色 相当于我们的应用程序, 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必须想办法解决,适配器模式来啦,看图;



适配器模式(Adapter)
 

hibernate只会访问ConnectionProvider接口,DBCPConnectionProvider和C3P0ConnnectionProvider为适配器,他们分别负责吧DBCP和C3P0连接池转换为ConnectionProvider接口。