设计模式:适配器模式
适配器模式
将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
适配器模式三要素
目标类
与客户端交互的接口,客户端面向目标类编程。
适配器
实现目标类的接口。在实现中把适配者中的方法转换为目标类中的方法。相当于桥接功能。
适配者
被适配的对象。
一个适配器模式实例
有一个电源220V(适配者),一台需要以5V充电(目标类)的手机(客户端),这时需要一个电源适配器(适配器)把220V的电转换成5V。
实例代码展示
目标类 PowerSupply.java
public interface PowerSupply{
int charge();
}
适配者类 Power.java
public class Power{
public int charge(){
System.out.println("220V");
return 220;
}
}
适配器类 PowerAdapter.java
public class PowerAdapter implements PowerSupply{
private Power power;
public PowerAdapter(){
power = new Power();
}
public int charge(){
int c = power.charge();
//change 220V to 5V
//...
return 5;
}
}
客户端 PhoneClient.java
public class PhoneClient{
public static void main(String[] args){
PowerSupply ps = (PowerSupply)PropertyUtil.getBean();
int c = ps.charge();
System.out.print("Phone Charge : " + c + "V");
}
}
PropertyUtil.java
import java.io.*;
import java.util.*;
public class PropertyUtil{
public static Object getBean(){
Object obj = null;
try{
Properties prop = new Properties();
InputStream in = new BufferedInputStream(new FileInputStream("adapter.properties"));
prop.load(in);
String className = prop.getProperty("className");
Class c = Class.forName(className);
obj = c.newInstance();
}catch(Exception e){
//Exception
e.printStackTrace();
}
return obj;
}
}
adapter.properties
className=PowerAdapter
对象适配器和类适配器
对象适配器是指适配器类中持有适配者对象。如:
public class PowerAdapter implements PowerSupply{
private Power power;
public PowerAdapter(){
power = new Power();
}
}
类适配器是指适配器类继承适配者对象。如:
public class PowerAdapter extends Power implements PowerSupply{
public PowerAdapter(){
}
}
类适配器中适配者不能是final类,因为final类不能被继承。在实际应用中,使用对象适配器居多。
特殊的适配器模式:缺省适配器
当有一个声明了若干个接口的接口文件,而你只需使用其中的一个接口而已。这时可以使用缺省适配器模式。定义一个抽像类实现这个接口。每个接口都使用空方法实现。因为业务类只需使用其中的一个接口而已,不必要实现其他的所有接口。此时业务类继承抽象类并覆盖所要使用的接口即可。
(完)