Android设计模式-19-适配器模式
2018-06-19 本文已影响37人
今阳说
1. 定义
- 定义一个包装类,用于包装不兼容接口的对象
- 将一个类的接口转换成客户希望的另外一个接口
- 适配器模式的形式分为:类的适配器模式(继承) & 对象的适配器模式(代理) & 缺省适配器模式(抽象类)
2. 应用场景
- 原本由于接口不兼容而不能一起工作的那些类需要在一起工作
3. 优缺点
- 优点:
- 可以让任何两个没有关联的类一起运行
- 提高了类的复用
- 增加了类的透明度
- 灵活性好
- 缺点:
- 过多地使用适配器,会让系统非常零乱
- 由于 java的单继承,至多只能适配一个适配者类,而且目标类必须是抽象类
4. Android源码中的使用:
适配器模式在Android中最常见的使用就是listView,recycleView的Adapter
5. 实例演示
以常见的手机等电子产品的电源适配器为例,手机充电需要5V输入,而我国家用电输出220V,美国则是110V,那么就需要充电器这个适配器了
- 创建一个供电基类
abstract class Volt {
public abstract int getVoltage();
}
- 创建一个供电实现类-中国220V
class VoltChina extends Volt {
public int getVoltage() {
return 220;
}
}
- 创建一个适配器基类
interface VoltAdapter {
int getVolt();
}
3.1. 类适配器模式的实现:类适配器继承原有类,重写其方法
//类的适配器模式:
class Volt220To5Adapter extends VoltChina implements VoltAdapter {
@Override
public int getVolt() {
int temp = getVoltage() / 44;
return temp;
}
}
3.2. 使用类适配器
private void methodAdapterPattern() {
// 类的适配器模式
Phone phone = new Phone();
phone.setVoltAdapter(new Volt220To5Adapter());
}
4.1. 对象适配器模式的实现: 对象适配器持有原有类的引用,以此获取所需要的原有类内容,并加以处理
//对象的适配器模式
abstract class Volt5Adapter implements VoltAdapter {
private final Volt volt;
public Volt5Adapter(Volt volt) {
this.volt = volt;
}
public int getVoltage() {
return volt.getVoltage();
}
@Override
abstract public int getVolt();
}
4.2. 使用对象适配器
private void methodAdapterPattern() {
//对象的适配器模式
phone.setVoltAdapter(new Volt5Adapter(new VoltChina()) {
@Override
public int getVolt() {
return getVoltage() / 44;
}
});
}
- 如果有一天去了美国,供电类改变了:
class VoltAmerican extends Volt {
public int getVoltage() {
return 110;
}
}
此时只要创建新的电源适配器即可,而不用对手机类进行修改,例如:
private void methodAdapterPattern() {
//对象的适配器模式
phone.setVoltAdapter(new Volt5Adapter(new VoltAmerican()) {
@Override
public int getVolt() {
return getVoltage() / 22;
}
});
}