设计模式:009_适配器模式

81 阅读3分钟

适配器模式

适配器模式是 Adapter,将一个类的接口转换成客户端希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式的三个角色

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户端按目标接口的格式访问适配者。

类适配器模式(使用继承)

适配器类通过继承适配者类,完成适配器模式。 缺点:因为使用了继承,无法再继承其他类,所以目标类必须是接口。 缺点:适配者类中的方法,在适配器类中暴露,增加了使用成本。

// 目标(Target)接口
public interface IVoltage5V {
    int output5V();
}

// 适配者(Adaptee)类
public class Voltage220V {
    public int output220V() {
        int voltage = 220;
        System.out.println("Voltage220V:" + voltage);
        return voltage;
    }
}

// 适配器(Adapter)类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
    @Override
    public int output5V() {
        // 将 Adaptee 中的内容,转成 Target 需要的内容
        int src = output220V();
        int dst = src - 215;
        System.out.println("VoltageAdapter:" + dst);
        return dst;
    }
}

客户端调用

public class Phone {
    public void charging(IVoltage5V iVoltage5V) {
        System.out.println("Phone:" + iVoltage5V.output5V());
    }
}
Phone phone = new Phone();
phone.charging(new VoltageAdapter());

对象适配器模式(使用组合)

适配器类通过组合关系适配者类,完成适配器模式。 优点:不使用继承而是组合关系,所以目标类可以不是接口。 优点:相比类适配器模式,遵守合成复用原则。 对象适配器模式是适配器模式中常用的一种。

// 目标(Target)接口
public interface IVoltage5V {
    int output5V();
}

// 适配者(Adaptee)类
public class Voltage220V {
    public int output220V() {
        int voltage = 220;
        System.out.println("Voltage220V:" + voltage);
        return voltage;
    }
}

// 适配器(Adapter)类
public class VoltageAdapter implements IVoltage5V {
    private Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        // 将 Adaptee 中的内容,转成 Target 需要的内容
        int src = voltage220V.output220V();
        int dst = src - 215;
        System.out.println("VoltageAdapter:" + dst);
        return dst;
    }
}

客户端调用

public class Phone {
    public void charging(IVoltage5V iVoltage5V) {
        System.out.println("Phone:" + iVoltage5V.output5V());
    }
}
Phone phone = new Phone();
Voltage220V voltage220V = new Voltage220V();
phone.charging(new VoltageAdapter(voltage220V));

接口适配器模式(缺省适配模式)

接口中的方法,不需要全部实现时; 通过抽象类实现接口,给每个方法提供默认实现; 抽象类的子类可以有选择的覆写父类需要具体实现的方法。

// 目标(Target)接口
public interface AnimatorListener {
    void onAnimationStart();

    void onAnimationPause();

    void onAnimationStop();
}

// 抽象适配器(Adapter)类;默认空实现接口中的方法
public abstract class AnimatorListenerAdapter implements AnimatorListener {
    @Override
    public void onAnimationStart() { }

    @Override
    public void onAnimationPause() { }

    @Override
    public void onAnimationStop() { }
}

客户端调用

// 抽象类的子类可以有选择的覆写父类需要具体实现的方法
AnimatorListenerAdapter adapter = new AnimatorListenerAdapter() {
    @Override
    public void onAnimationStart() {
        System.out.println("onAnimationStart run");
    }
};
adapter.onAnimationStart();