1. 定义
- 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能一起工作。
2. 使用场景
- 系统需要使用现有的类,而该类的接口不符合系统的需要,即接口不兼容
- 想建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类
- 需要一个统一的输出接口,而输入端的类型不可预知
3.适配器模式分类
- 适配器可分为
类适配器模式和对象适配器模式,相对而言,对象适配器模式会更加灵活实用
4. UML类图
- Target:目标角色
- Adaptee:需要适配的接口
- Adapter:适配器角色,该模式的核心所在,是一个具体类,承担了将源接口转换为目标接口的角色
5. 简单实现
- 需求:国内的电压是220v,而美国的电器是110v,美国人来中国就需要一个将220v转换为110v的适配器
目标接口
/**
* Target角色(获得110v电压)
*
* @author BTPJ 2022/9/26
*/
public interface Volt110 {
int getVolt110();
}
原始类
/**
* Adaptee角色,需要被转换的对象(220v电压)
*
* @author BTPJ 2022/9/26
*/
public class Volt220 {
public int getVolt220() {
return 220;
}
}
5.1 使用类适配器的实现方式
适配器
/**
* Adapter类适配器角色(将220v转换为110v)
*
* @author BTPJ 2022/9/26
*/
public class VoltAdapter extends Volt220 implements Volt110 {
@Override
public int getVolt110() {
return 110;
}
}
测试类
/**
* 类适配器测试类
*
* @author BTPJ 2022/9/26
*/
public class TestClient {
public static void main(String[] args) {
VoltAdapter adapter = new VoltAdapter();
System.out.println("类适配器方式输出电压为:" + adapter.getVolt110());
}
}
运行结果:
类适配器方式输出电压为:110
5.2 使用对象适配器的实现方式
适配器
/**
* Adapter对象适配器角色(将220v转换为110v)
*
* @author BTPJ 2022/9/26
*/
public class VoltAdapter implements Volt110 {
private Volt220 mVolt220;
public VoltAdapter(Volt220 volt220) {
this.mVolt220 = volt220;
}
public int getVolt220() {
return mVolt220.getVolt220();
}
@Override
public int getVolt110() {
return 110;
}
}
测试类
/**
* 对象适配器测试类
*
* @author BTPJ 2022/9/26
*/
public class TestClient {
public static void main(String[] args) {
VoltAdapter adapter = new VoltAdapter(new Volt220());
System.out.println("对象适配器方式输出电压为:" + adapter.getVolt110());
}
}
运行结果:
对象适配器方式输出电压为:110
- 由此可见:类适配器模式常用的方式是继承,而对象适配器模式则是聚合
6. 源码中的使用场景
- ListView、RecyclerView中使用适配器模式绑定列表数据
7. 优缺点
- 优点:
- 更好的复用性;
- 更好的扩展性;
- 缺点:
- 过多地使用适配器会导致系统变得零乱,不易整体把握