定义:将一个类的接口转换为客户期望的另一个接口,使原本接口不兼容的两个类可以一起工作。
适配器模式是结构型设计模式,通常,我们在设计和编写新项目的时候不需要考虑使用这种设计模式,它更多的是用在后期项目的维护上,是一种“亡羊补牢”的手段。比如说我们想要使用一个已经存在的类,但是它的方法和需求不匹配的时候就可以使用适配器模式,这种不匹配很可能是前期设计的缺陷。
适配器模式可以分为类适配器和对象适配器,它们的区别在于类适配器通过继承的手段来进行适配,而对象适配器通过组合的方式来进行适配。
适配器模式有3个角色:
目标角色:期待得到的接口。
需要适配的接口。
适配器:将需要适配的接口适配成目标接口。
举例子:
现在我们的生活已经离不开手机了,每天都需要给手机充电,家用的电压都是220V,但是我们的手机一般需要使用5V的输出电压进行充电,我们可以用充电器充电,通过它可以将220V适配成5V。在这里,220V电压就是需要适配的接口,5V是目标角色,而充电器就充当了我们的适配器角色。
先使用类适配器来进行适配,类适配器是使用继承来实现的。
需要适配的接口:
public class AC220V {
public void output220V() {
System.out.println("220V");
}
}
目标角色:期待得到的接口。
public interface DC5V {
void output5V();
}
适配器:将需要适配的接口适配成目标接口。通过继承被适配者以及实现目标接口来定义
public class Adapter extends AC220V implements DC5V{
@Override
public void output5V() {
super.output220V();
//这里可以进行一些变压操作
System.out.println("适配后输出5V");
}
}
客户端调用:
public static void main(String[] args) {
DC5V dc5v=new Adapter();
dc5v.output5V();
}
可以发现类适配器确实是通过继承的方式来实现,不过在开发中更多是使用对象适配器,因为它更加灵活。
对象适配器
需要适配的接口以及目标角色和上面一样,对象适配器如下:
public class ObjectAdapter implements DC5V{
private AC220V mAc220V;
public ObjectAdapter(AC220V ac220V) {
mAc220V=ac220V;
}
@Override
public void output5V() {
mAc220V.output220V();
//这里可以进行一些变压操作
System.out.println("适配后输出5V");
}
}
可以看到对象适配器实现了目标接口然后将需要适配的角色组合进来,它比通过继承的方式更加灵活。
适配器模式的优点:
提高了类的复用性,现有的类可以复用而不需要改变,通过适配器模式来解决现有类和目标类不匹配问题、符合开闭原则以及提高了程序扩展性。
适配器模式的缺点:
增加系统复杂度,降低了代码的可读性。