适配器模式

将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

适配器模式三要素

目标类

与客户端交互的接口,客户端面向目标类编程。

适配器

实现目标类的接口。在实现中把适配者中的方法转换为目标类中的方法。相当于桥接功能。

适配者

被适配的对象。

一个适配器模式实例

有一个电源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类不能被继承。在实际应用中,使用对象适配器居多。

特殊的适配器模式:缺省适配器

当有一个声明了若干个接口的接口文件,而你只需使用其中的一个接口而已。这时可以使用缺省适配器模式。定义一个抽像类实现这个接口。每个接口都使用空方法实现。因为业务类只需使用其中的一个接口而已,不必要实现其他的所有接口。此时业务类继承抽象类并覆盖所要使用的接口即可。

(完)