1.概念
适配器设计模式是一种常用的设计模式,他的主要作用是将一个类的接口转换成客户端所期望的另一种接口形式,从而使原本由于接口不兼容而无法协同工作的类能够一起工作。
这种设计模式在编程中非常常见,尤其是在处理不同系统,不同协议或者不同数据格式之间的转换时。
2.适用场景
2.1 接口不兼容
当新老系统接口不兼容,或者某个类提供的接口,不符合客户端的期望时,可以使用适配器模式进行转换
2.2 插件式系统
在插件式系统中,不同的插件可能使用不同的接口或协议,此时可以使用适配器模式将不同的插件接口统一转换成一个统一的接口。
2.3 数据格式转换
在处理不同数据格式之间的转换时,如XML、JSON、二进制等格式之间的转换,适配器模式可以很好地解决这个问题
3.基本原理
适配器模式的主要组成部分包括目标接口、适配器和被适配者。
其中,目标接口是客户端期望的接口;被适配者是需要被适配的接口或类;适配器则实现了目标接口,并将其转换为被适配者可以理解的形式。
3.1.类的适配器模式
类的适配器模式是通过创建一个适配器类来实现的。这个适配器类实现了目标接口,并持有被适配者的实例。当客户端调用目标接口的方法时,适配器会将请求转换为对被适配者相应方法的调用
3.2 对象适配器模式
对象适配器模式则是通过将适配器对象与被适配者对象关联起来实现的。适配器类不继承被适配者类,而是持有其对象引用。这种方式更加灵活,因为适配器可以与任何实现了被适配接口的对象一起使用
4.实现步骤
4.1 确定目标接口
首先需要确定客户端所期望的接口,即目标接口。这个接口应该清晰地定义客户端需要的功能
4.2 创建被适配者
被适配者是需要被转换的类或接口。它可能是一个已经存在的类或接口,也可能是一个需要被模拟的接口
4.3 实现适配器
根据被适配者的类型,选择合适的适配器模式(类适配器或对象适配器)来实现适配器类。适配器类应该实现目标接口,并持有被适配者的引用或实例。在适配器类中,需要实现将目标接口的请求转换为对被适配者相应方法的调用
4.4 客户端使用适配器
客户端通过调用适配器类的方法来实现对被适配者的操作。由于适配器类实现了目标接口,因此客户端无需关心被适配者的具体实现细节
5.代码实现
旧接口
假设我们有一个旧的服务接口 OldService
,它有一个方法 oldMethod()
:
public interface OldService {
void oldMethod();
}
新接口
现在有一个新的服务接口 NewService
,它有一个方法 newMethod()
:
public interface NewService {
void newMethod();
}
这两个接口不兼容,我们希望通过一个适配器来将 OldService
适配成 NewService
的形式。
类适配器示例
LegacyService 类(旧服务接口)
public class LegacyService {
public void oldMethod() {
System.out.println("Legacy service is performing an old method.");
}
}
Adapter 类(适配器)
Adapter 类实现了 NewService
接口,并继承了 LegacyService
类,通过这种方式来实现适配器模式的效果
public class Adapter extends LegacyService implements NewService {
@Override
public void newMethod() {
// 实现 NewService 接口中的 newMethod 方法
System.out.println("Adapter is performing a new method.");
}
}
Client 类(客户端)
客户端通过 NewService
接口来使用适配后的服务:
java
public class Client {
private NewService newService;
public Client(NewService newService) {
this.newService = newService;
}
public void useNewService() {
newService.newMethod();
}
public static void main(String[] args) {
// 使用适配器将 LegacyService 适配成 NewService
Adapter adapter = new Adapter();
Client client = new Client(adapter);
client.useNewService();
}
}
LegacyService类:旧的服务类,提供了 oldMethod()
方法。
Adapter类:继承了 LegacyService
类并实现了 NewService
接口。在 newMethod()
方法中,适配器实现了 NewService
接口的方法,并在内部调用了 LegacyService
类的 oldMethod()
方法,从而适配了 LegacyService
到 NewService
接口的需求。
Client类:使用 NewService
接口来调用适配后的服务。在 main
方法中,创建了 Adapter
对象并传递给 Client
,然后调用 useNewService()
方法来使用适配后的功能。