design pattern - Adapter

来源:互联网 发布:java continue 编辑:程序博客网 时间:2024/05/21 21:45

 

  通常客户类(client class)通过类的服务器类(server class)的接口访问它提供的服务。服务器类可以提供客户类的功能需要,但有时它提供的接口却不是客户类所期望的。在这种情况下,要把现有的接口转化为客户类所期望的接口,这样才能保证对现有类的重用。适配器模式就是为这样的转换而设计的。适配器模式建议定义一个包装类来包装不兼容接口的对象。这个包装类指的就是适配器Adapter,被包装的对象就是适配者Adaptee。适配器(Adapter)提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适配者(Adaptee)的相应接口的调用。换句话说,当客户调用适配器类的方法时,在适配器类的内部调用适配者类的方法,这个过程对适配者类是透明的,客户并不直接调用适配者类的方法。请注意,此处所说的接口,并不是java语言中的接口类型,而是指一个类对外暴露的编程接口。

 

    适配器总体可分为两类:类适配器(class adapter)和对象适配器(object adapter)

 

    类适配器是通过继承适配者(Adaptee class)类实现的,另外类适配器实现客户类所需要的接口,当客户类对象调用适配者类的方法的时候,适配器内部调用它所继承的适配者类的方法。

 

    对象适配器是包含一个适配者器的引用,与类适配器相同,对象适配器也实现了客户需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调用它所包含的适配者器的实例的适当方法。

 

    对于适配器类在现实生活中有一个典型的例子,就是电压转换插座。各国都有自己的额定电压标准,所以当一个国家的电器带到另一个国家使用时,要使用转换插座才能让电器正常运行。比如美国电器的额定电压是120V,中国电器的额定电压是220V,以下示例就是一个对中国和美国电器之间实现电压转换的抽象。首先定义两个电器类的interface: ChineseApplianceUSAppliance

 

package plugadpter;

public interface ChineseAppliance {
 
 void powerOn(ChinesePlug cp);

}

 

package plugadpter;

public interface USAppliance {
 void powerOn(USPlug up);

}

 

再定义两个插座类的interface: ChinesePlugUSPlug。两个电器接口中的powerOn方法,分别要用到ChinesePlugUSPlug对象作为参数。

 

package plugadpter;

public interface ChinesePlug {
 
 public void chargeIn220V();

}

 

package plugadpter;

public interface USPlug {
    public void chargeIn120V();
}

 

对于ChineseAppliance接口,写一个类ChineseTV来实现。对于USAppliance接口,写一个USFridge类来实现。同样对于ChinesePlug接口,写一个ChinesePlugInstance类实现。对于USPlug接口写一个USPlugInstance类实现。

 

package plugadpter;

public class ChineseTV implements ChineseAppliance {
 public void powerOn(ChinesePlug cp){
  cp.chargeIn220V();
  System.out.println("ChineseTV is on");
 }

}

 

package plugadpter;

public class USFridge implements USAppliance {
 public void powerOn(USPlug up){
  up.chargeIn120V();
  System.out.println("USFridge is on");
 }

}

 

package plugadpter;

public class ChinesePlugInstance implements ChinesePlug {
 
 public void chargeIn220V(){
  System.out.println("charge in volt 220");
 }

}

 

package plugadpter;

public class USPlugInstance implements USPlug{
 public void chargeIn120V(){
  System.out.println("charge in volt 120");
 }

}

 

最后我们要做的就是写Adapter类来实现两种电压间的转换。这里我们分别创建两种类型的Adapterclass adapterobject adapter来实现转换。ChinaToUSAdapter1ChinaToUSAdapter2类实现把中国电压转换成美国电压,USToChinaAdapter1USToChinaAdapter2类实现把美国电压转换成中国电压。

 

/*class Adapter aims to change the
 * China standard voltage to US standard voltage
 */
package plugadpter;

public class ChinaToUSAdapter1 extends ChinesePlugInstance implements USPlug {
 public void chargeIn120V(){
  chargeIn220V();
 }

}

 

/*object Adapter aims to change the
 * China standard voltage to US standard voltage
 */
package plugadpter;

public class ChinaToUSAdapter2 implements USPlug {
 private ChinesePlugInstance cpi = new ChinesePlugInstance();
 public void chargeIn120V(){
  cpi.chargeIn220V();
 }

}

 

/*class Adapter aims to change the
 * US standard voltage to China standard voltage
 */
package plugadpter;

public class USToChinaAdapter1 extends USPlugInstance implements ChinesePlug {
 public void chargeIn220V(){
  chargeIn120V();
 }
}

 

/*object Adapter aims to change the
 * US standard voltage to China standard voltage
 */
package plugadpter;

public class USToChinaAdapter2 implements ChinesePlug {
    private USPlugInstance upi = new USPlugInstance();
    public void chargeIn220V(){
     upi.chargeIn120V();
    }
}

 

最后我们写一个AdapterTester类来测试一下,这四个Adapter

 

package plugadpter;

public class AdapterTester {
 
 public static void main(String[]args){
  USFridge usfridge = new USFridge();
  //use class adapter
  usfridge.powerOn(new ChinaToUSAdapter1());
  //use object adapter
  usfridge.powerOn(new ChinaToUSAdapter2());
  ChineseTV chinesetv = new ChineseTV();
  //use class adapter
  chinesetv.powerOn(new USToChinaAdapter1());
  //use object adapter
  chinesetv.powerOn(new USToChinaAdapter2());
 }

}

/*
output:
charge in volt 220
USFridge is on
charge in volt 220
USFridge is on
charge in volt 120
ChineseTV is on
charge in volt 120
ChineseTV is on
*/

 

 

原创粉丝点击