适配器模式(Adapter Pattern),也称为包装器(Wrapper)模式,是一种结构型设计模式,它允许不兼容的接口之间进行交互。适配器模式通过包装一个已有的类,提供一个与原系统兼容的接口,从而使得原本由于接口不兼容而不能一起工作的类可以协同工作。
适配器模式通常在以下场景中使用:
假设有一个旧的电子邮件系统,它的客户端代码只能与EmailClient接口兼容。现在,你想要集成一个新的邮件系统,但是其接口与旧系统不兼容。适配器模式可以在这里发挥作用。
// 旧的电子邮件客户端接口
public interface EmailClient {
void sendEmail(String messageBody);
}
// 新的邮件系统接口
public interface AdvancedEmailClient {
void sendEmailMessage(String subject, String body);
}
// 适配器实现
public class EmailAdapter implements EmailClient {
private AdvancedEmailClient advancedEmailClient;
public EmailAdapter(AdvancedEmailClient client) {
this.advancedEmailClient = client;
}
@Override
public void sendEmail(String messageBody) {
advancedEmailClient.sendEmailMessage("Adapted", messageBody);
}
}
// 新邮件系统类实现
public class NewEmailSystem implements AdvancedEmailClient {
public void sendEmailMessage(String subject, String body) {
// 新邮件系统的发送逻辑
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
AdvancedEmailClient newEmailSystem = new NewEmailSystem();
EmailClient client = new EmailAdapter(newEmailSystem);
client.sendEmail("Hello World!");
}
}
适配器模式遵循了以下设计原则:
然而,过多地使用适配器可能会导致系统中类的数量增加,并且增加系统的复杂性,这可能与简洁性(KISS)原则和最少知识原则(Law of Demeter)相冲突。
适配器模式是实现系统间组件接口兼容的一个有效途径。它允许现有系统与第三方库、新系统或者未来的系统进行交互,而不需要修改现有的代码。
建议在以下情况使用适配器模式:
在设计系统时,应当谨慎使用适配器模式,以避免不必要的复杂性。如果接口不匹配的问题可以通过重构来解决,那么可能更应该选择重构而非适配器。适配器模式应当作为连接不兼容接口的最后手段,而不是首选解决方案。