(《设计模式解析与实战——何红辉,关爱民》读书笔记)
一、定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
比如,最常见的ListView,需要使用Adapter来将数据和View绑定在一起。
二、使用场景
(1)系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容;
(2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作;
(3)需要一个统一的输出接口,而输入端的类型不可预知。
三、适配器模式应用的简单示例
示例:充电头将220V电压转化为5V电压。
适配器模式分为两种:
1、类适配器模式
/**
* 目标角色,所期待得到的接口。这里是类适配器模式,因此目标不可以为类
*/
public interface FiveVolt {
public int getVolt5();
}
/**
* Adaptee角色,需要被转换的对象:需要适配的接口
*/
public class Volt220 {
public int getVolt220() {
return 220;
}
}
/**
* Adaper角色:本模式的核心。适配器把源接口转换成目标接口,必须是具体类
*/
public class VoltAdapter extends Volt220 implements FiveVolt{
@Override
public int getVolt5() {
return 5;
}
}
public class Test {
public static void main(String[] args) {
VoltAdapter adapter = new VoltAdapter();
System.out.println("输出电压:" + adapter.getVolt5());
}
}
2、对象适配器模式
与类适配器模式一样,对象的适配器模式把被适配的类的API转换成目标类的API,不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用代理关系连接到Adaptee类。
/**
* 对象适配器模式
*/
public class VoltAdapter implements FiveVolt {
private Volt220 mVolt220;
public VoltAdapter(Volt220 volt220) {
this.mVolt220 = volt220;
}
public int getmVolt220() {
return mVolt220.getVolt220();
}
@Override
public int getVolt5() {
return 5;
}
}
public class Test {
public static void main(String[] args) {
VoltAdapter adapter = new VoltAdapter(new Volt220());
System.out.println("输出电压:" + adapter.getVolt5());
}
}
运行结果和上面一样。
在实际开发中,使用Adapter模式的过程中尽量使用对象适配器的实现方式,多用合成或者聚合,少用继承。当然,具体问题具体分析,根据需要来选用实现方式,最合适的才是最好的。
四、总结
优点:
(1)更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要,那么通过适配器模式就可以让这些功能得到更好的复用;
(2)更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
缺点:
过多的使用适配器,会让系统非常零乱,不易整体把握。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。