介面卡(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);