介面卡(Java)

讓我們假設在你當前的程式碼庫中,存在 MyLogger 介面,如下所示:

interface MyLogger {
    void logMessage(String message);
    void logException(Throwable exception);
}

讓我們說你已經建立了一些具體的實現,比如 MyFileLoggerMyConsoleLogger

你已決定使用框架來控制應用程式的藍芽連線。這個框架包含一個帶有以下建構函式的 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);