适配器模式
适配器模式是 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();