介绍
适配器模式是一种结构型设计模式,主要用于将一个类的接口转换成客户端期望的另一个接口。这样,原本由于接口不匹配而无法一起工作的类可以通过适配器一起工作。
组成
结构图
场景
假设我们原有系统使用了一个名为LegacyLogger的日志记录类,现在,我们引入了一个新的日志记录框架,我们希望在不修改现有系统代码的情况下,将新的日志记录框架整合到原有系统中,这时可以使用适配器模式。
代码
//原有的日志记录类
public class LegacyLogger {
public void log(String message) {
System.out.println("Legacy Logging: " + message);
}
}
//新的日志记录框架
public interface NewLogger {
void logInfo(String message);
void logError(String message);
}
//适配器接口
public interface LegacyLoggerAdapter extends NewLogger {
// 可以添加一些额外的方法或进行适配
// void logDebug(String message);
}
//适配器实现
public class LegacyLoggerAdapterImpl implements LegacyLoggerAdapter {
private LegacyLogger legacyLogger;
public LegacyLoggerAdapterImpl(LegacyLogger legacyLogger) {
this.legacyLogger = legacyLogger;
}
@Override
public void logInfo(String message) {
// 将新日志框架的info级别映射为旧日志框架的log方法
legacyLogger.log(message);
}
@Override
public void logError(String message) {
// 将新日志框架的error级别映射为旧日志框架的log方法
legacyLogger.log(message);
}
}
public class Client {
public static void main(String[] args) {
// 原有系统使用LegacyLogger
LegacyLogger legacyLogger = new LegacyLogger();
legacyLogger.log("Legacy log message");
// 引入新日志框架,使用适配器整合到原有系统中
NewLogger newLogger = new LegacyLoggerAdapterImpl(legacyLogger);
newLogger.logInfo("New log message: info");
newLogger.logError("New log message: error");
}
}
在这个例子中,LegacyLoggerAdapter是适配器接口,LegacyLoggerAdapterImpl是适配器的具体实现,它实现了NewLogger接口,内部使用LegacyLogger来实现新的日志框架接口。客户端代码可以通过NewLogger接口来调用新的日志框架,同时保留了原有系统对LegacyLogger的调用,实现了平滑过渡。这样就不需要修改原有系统代码,而能够整合新的功能。
优点
总的来说,适配器模式适用于系统升级、整合或引入新功能时,希望保留原有系统的情况。通过适配器,可以使得新旧系统能够平滑地协同工作,提高系统的可维护性和灵活性。