适配器(Java)
让我们假设在你当前的代码库中,存在 MyLogger
接口,如下所示:
interface MyLogger {
void logMessage(String message);
void logException(Throwable exception);
}
让我们说你已经创建了一些具体的实现,比如 MyFileLogger
和 MyConsoleLogger
。
你已决定使用框架来控制应用程序的蓝牙连接。这个框架包含一个带有以下构造函数的 BluetoothManager
:
class BluetoothManager {
private FrameworkLogger logger;
public BluetoothManager(FrameworkLogger logger) {
this.logger = logger;
}
}
BluetoothManager
也接受一个记录器,这太棒了! 但是它需要一个接口由框架定义的记录器,并且他们使用方法重载而不是以不同方式命名它们的函数:
interface FrameworkLogger {
void log(String message);
void log(Throwable exception);
}
你已经拥有了许多想要重用的 MyLogger
实现,但它们不适合 FrameworkLogger
的界面。这是适配器设计模式的用武之地:
class FrameworkLoggerAdapter implements FrameworkLogger {
private MyLogger logger;
public FrameworkLoggerAdapter(MyLogger logger) {
this.logger = logger;
}
@Override
public void log(String message) {
this.logger.logMessage(message);
}
@Override
public void log(Throwable exception) {
this.logger.logException(exception);
}
}
通过定义实现 FrameworkLogger
接口并接受 MyLogger
实现的适配器类,可以在不同接口之间映射功能。现在可以将 BluetoothManager
与所有 MyLogger
实现一起使用,如下所示:
FrameworkLogger fileLogger = new FrameworkLoggerAdapter(new MyFileLogger());
BluetoothManager manager = new BluetoothManager(fileLogger);
FrameworkLogger consoleLogger = new FrameworkLoggerAdapter(new MyConsoleLogger());
BluetoothManager manager2 = new BluetoothManager(consoleLogger);