适配器(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);