一、模式定义
将一个类的接口转换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
Convert the interface of a class into another interface clients expect.Adapter lets classes work
together that couldn't otherwise because of incompatible interfaces.
二、模式结构
2.1 类图
Adaptee.png
-
Client
:客户端。调用自己需要的领域接口 Target。 -
Target
:目标角色。定义客户端需要的跟特定领域相关的接口。 -
Adaptee
:源角色。已经存在的接口,通常能满足客户端的功能要求,但是接口与客户端要求的特定领域接口不一致,需要被适配。 -
Adapter
:适配器角色。适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色时需要新建立的,它的职责非常简单:把源角色转换成目标角色。
2.2 代码
Target:
public interface Target {
void request();
}
Adaptee:
public class Adaptee {
public void specificRequest() {
System.out.println("需要被适配的类!");
}
}
Adapter:
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.specificRequest();
}
}
Client:
public class Client {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
三、模式讲解
3.1 功能
适配器的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。
适配器里面可以实现功能,称这种适配器为智能适配器。在接口匹配和转换的过程中,也有可能需要额外实现一定的功能,才能转换过来,比如需要调整参数以进行匹配等。
3.2 常见实现
在实现适配器的时候,适配器通常是一个类,一般会让适配器类去实现Target 接口,然后在适配器的具体实现里面调用 Adaptee。
3.3 优缺点
优点:
- 更好的复用性
- 更好的可扩展性
缺点:
- 过多地使用适配器,会让系统非常零乱,不容易整体进行把握
3.4 本质
转换匹配,复用功能。
适配器通过转换调用已有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。也就是说转换匹配是手段,而复用已有的功能才是目的。
3.5 应用场景
- 如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口。
- 如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么。
- 如果你想使用一些已经存在的子类,但是不可能对每一个子类都进行适配,这种情况可以选用对象适配器,直接适配这些子类的父类就可以了。