一、什么是适配器模式?
适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另外一个接口。这种模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
二、 模式结构
适配器模式主要包含以下角色:
- 目标接口(Target):客户所期待的接口,可以是类或抽象类。
- 源接口(Adaptee):需要被适配的接口。
- 适配器(Adapter):将源接口适配成目标接口的类。
三、 适配器模式的实例
3.1. 例子一:USB Type-C 转接头
在现代设备中,USB Type-C 接口已经成为了一种标准,但是许多旧设备仍然使用着老式的 USB 接口。为了让这些旧设备能够与新设备兼容,可以使用 USB Type-C 转接头作为适配器。
// 目标接口:USB Type-C
public interface USBTypeC {
void connect();
}
// 源接口:USB
public class USB {
public void plugIn() {
System.out.println("插入 USB 设备");
}
}
// 适配器:USB 转 USB Type-C
public class USBTypeCAdapter implements USBTypeC {
private USB usb;
public USBTypeCAdapter(USB usb) {
this.usb = usb;
}
@Override
public void connect() {
usb.plugIn();
System.out.println("通过 USB Type-C 转接头连接");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
USB usb = new USB();
USBTypeC usbTypeC = new USBTypeCAdapter(usb);
usbTypeC.connect();
}
}
3.2. 例子二:美国插头转换器
假设有一款产品只配备了美国标准的插头,但是用户在欧洲使用时需要欧洲标准的插头。这时候可以使用插头转换器作为适配器,将美国标准的插头转换成欧洲标准的插头。
// 目标接口:欧洲标准插头
public interface EuroPlug {
void plugIn();
}
// 源接口:美国标准插头
public class USPlug {
public void plugIn() {
System.out.println("插入美国标准插头");
}
}
// 适配器:美国标准插头转换成欧洲标准插头
public class USPlugToEuroAdapter implements EuroPlug {
private USPlug usPlug;
public USPlugToEuroAdapter(USPlug usPlug) {
this.usPlug = usPlug;
}
@Override
public void plugIn() {
usPlug.plugIn();
System.out.println("通过转换器转换成欧洲标准插头");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
USPlug usPlug = new USPlug();
EuroPlug euroPlug = new USPlugToEuroAdapter(usPlug);
euroPlug.plugIn();
}
}
四、优缺点
4.1. 优点:
- 提高代码复用性:适配器模式可以使得原本由于接口不兼容而不能一起工作的类可以一起工作,提高了代码的复用性。
- 增加类的透明性:客户端通过目标接口与适配器交互,无需关心适配器是如何将请求转发给源接口的,增加了类的透明性。
4.2. 缺点:
- 增加系统复杂性:适配器模式需要增加额外的适配器类,增加了系统的复杂性。
- 可能引入不必要的代价:如果目标接口与源接口完全不同,可能需要适配器对请求进行复杂的转换,这可能引入不必要的代价。
综上所述,适配器模式在软件开发中具有广泛的应用场景,能够有效地解决接口不兼容的问题,提高代码的复用性和系统的可扩展性。在使用适配器模式时,需要权衡其优缺点,并根据具体情况进行选择。