什么是适配器模式
适配器模式是一种结构型设计模式,它允许将现有的类或接口转换成需要的另一个接口,使原本不兼容的接口可以一起工作。适配器模式通常用于解决新旧系统之间的接口不兼容问题,也可以用于封装一些复杂的逻辑。
为什么使用适配器模式
当你希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。
如果您需要复用这样一些类, 他们处于同一个继承体系, 并且他们又有了额外的一些共同的方法, 但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。
有时候我们需要使用一些已有的代码或类库,但是它们并不符合我们的需求,那么我们可以使用适配器模式来将它们转换成我们需要的接口。适配器模式可以帮助我们在不改变已有代码的情况下快速实现功能需求。
工作中用在哪里
适配器模式通常在已有程序中使用, 让相互不兼容的类能很好地合作。
适配器可以对已有对象的接口进行修改。
适配器能为被封装对象提供不同的接口
在 Android 开发中,适配器模式非常常见。例如,ListView 是一个常用的列表控件,它需要一个 Adapter(适配器)来进行数据的加载和显示。我们可以定义一个适配器来处理不同格式的数据,然后将其转换为 ListView 所需要的格式。另外,在不同版本的 Android 系统上,布局文件的命名规则也会有所不同,我们可以使用适配器模式来处理这种兼容性问题。
设计思路
适配器模式主要由三个角色组成:
- 目标接口(Target):客户端所需要的接口,它定义了客户端所需的请求。
- 源接口(Adaptee):需要被适配的接口,它定义了现有的接口,但是与客户端需要的接口不兼容。
- 适配器(Adapter):将源接口转换为目标接口的类,它实现了目标接口,并且持有一个源接口的实例。
适配器模式的核心思想是在适配器中持有一个源接口的实例,并将源接口的方法转换为目标接口的方法。这种转换可以通过继承或聚合来实现。
代码实现
现在我们需要定义一个220V转换成5V的接口:
interface Adapter {
//适配器类
int convert_5v();//装换成5V
}
被适配角色,一般是已存在的类,需要适配新的接口。生活中的220V电源无处不在:
public class Electric {
// 电源
public int output_220v() {
//输出220V
return 220;
}
}
我们需要一个具体适配器,这个适配器就是变压器,能够将220V转为5V输出:
第一种方式对象适配器(比较常用的一种)
public class PhoneAdapter1 implements Adapter {
//手机适配器类
private Electric mElectric;//适配器持有源目标对象
public PhoneAdapter(Electric electric) {
//通过构造方法传入对象
mElectric = electric;
}
@Override
public int convert_5v() {
System.out.println("适配器一开始工作:");
System.out.println("输入电压:" + mElectric.output_220v());
System.out.println("输出电压:" + 5);
return 5;
}
}
第二种方式类适配器(通过继承来实现)
public class PhoneAdapter2 extends Electric implements Adapter {
@Override
public int convert_5v() {
int param = output_220v();
return suit(param);
}
/**
* 转换操作
* 当然你可以在转换中做很多事情(这里只是简单的说明)
*/
private int suit(int param) {
int output = param / 44;
System.out.println("适配器二开始工作:");
System.out.println("输入电压:" + mElectric.output_220v());
System.out.println("输出电压:" + output);
return output;
}
}
测试类
public void test() {
Electric electric = new Electric();
System.out.println("默认电压:" + electric.output_220v());
Adapter phoneAdapter1 = new PhoneAdapter1(electric);//传递一个对象给适配器
System.out.println("适配转换后的电压1:" + phoneAdapter.convert_5v());
Adapter phoneAdapter2 = new PhoneAdapter2();
System.out.println("适配转换后的电压2:" + phoneAdapter2.convert_5v());
}
输出结果
默认电压:220
适配器一开始工作:
输入电压:220
输出电压:5
适配转换后的电压:5
适配器二开始工作:
输入电压:220
输出电压:5
适配转换后的电压:5
总结
适配器模式是一种常用的设计模式,它能够帮助我们在不改变已有代码的情况下快速实现功能需求。在 Android 开发中,适配器模式非常常见,尤其是在处理列表等控件时。适配器模式的核心思想是在适配器中持有一个源接口的实例,并将源接口的方法转换为目标接口的方法。