概述
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
构造器模式
上面的概述可能不是太容易理解,下面举一个例子说明适配器模式的应用。
大家都知道,新款iPhone 7手机使用了扁口的Lightning接口耳机插槽,而旧款的3.5mm普通耳机是否就不能使用了呢?其实不然,iPhone 7配件中随机附赠了一个小玩意,可直接将普通3.5mm耳机转换为iPhone 7可使用的耳机。
而这个小配件就是一个适配器Adapter,iPhone 7就是目标接口Target,而普通的3.5mm耳机就是待适配者Adaptee。
再如,市面上出售的安卓数据线转iPhone Lightning接口的转换器,都可以被认为是一个Adapter,类似例子比比皆是。
其实,适配器模式的核心,就是使得接口完全不相干的两个类可以协同工作。
1、类的适配器模式
/**
* 带有lightning耳机接口的iPhone7 [Target - 目标接口]
*/
public interface IPhone7 {
void listenWithLightning();
}
/**
* 普通3.5mm耳机 [Adaptee - 待适配者]
*/
public abstract class Headphone {
public abstract void listenWithCommon();
}
/**
* lightning to 3.5mm耳机 转换器 [Adapter - 适配器]
*/
public class HeadphoneAdapter extends Headphone implements IPhone7 {
@Override
public void listenWithLightning() {
}
@Override
public void listenWithCommon() {
}
}
HeadphoneAdapter
通过继承一个类,然后实现一个新的接口,完成了 Headphone
与 IPhone7
的兼容。
像上面这个结构,在Java开发中非常常见,这属于类的适配器模式。
2、对象的适配器模式
还有一种基于对象的适配器模式,即对象的适配器模式。
将上面的 HeadphoneAdapter
类做如下修改:
/**
* lightning to 3.5mm耳机 转换器 [Adapter - 适配器]
*/
public class HeadphoneAdapter implements IPhone7 {
private Headphone headphone;
public HeadphoneAdapter(Headphone headphone) {
this.headphone = headphone;
}
@Override
public void listenWithLightning() {
}
public void listenWithCommon() {
headphone.listenWithCommon();
}
}
此时,HeadphoneAdapter
要将 Headphone
适配为 iPhone 7
可识别的耳机,直接持有该类的实例,调用该类的 listenWithCommon()
方法即可。 此为对象的适配器模式。
3、接口的适配器模式
适配器模式中的第三种模式也非常常见——接口的适配器模式。
当不希望实现一个接口中所有的方法时,可以创建一个抽象类继承该接口,并实现空方法或默认方法,子类只需继承该抽象类即可。
/**
* 抽象适配器类
*/
public abstract class Adapter extends Headphone implements IPhone7 {
@Override
public void listenWithLightning() {
}
}
/**
* 具体适配器类
*/
public class HeadphoneAdapter extends Adapter {
@Override
public void listenWithCommon() {
}
}
可以看到,HeadphoneAdapter
无需实现 listenWithLightning()
方法,该方法已由父类 Adapter
做了默认空实现。
Android中的适配器模式
public interface ListAdapter extends Adapter {
//...
}
public interface SpinnerAdapter extends Adapter {
//...
}
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
//...
}
BaseAdapter
既实现了 ListView
的功能,也实现了 Spinner
的功能。
本文由Fynn_原创,未经许可,不得转载!