Что такое паттерн Адаптер и приведи пример его использования?

«Что такое паттерн Адаптер и приведи пример его использования?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерн Адаптер (Adapter) преобразует интерфейс одного класса в интерфейс, ожидаемый клиентом. Он позволяет несовместимым классам работать вместе.

Пример: Интеграция старой системы логирования с новым интерфейсом приложения.

// 1. Целевой интерфейс, который ожидает клиент (новая система)
interface NewLogger {
    void logMessage(String message);
}

// 2. Адаптируемый класс (старая, несовместимая система)
class LegacyLogger {
    public void log(String msg, String level) {
        System.out.println("[" + level + "]: " + msg);
    }
}

// 3. Адаптер, реализующий целевой интерфейс и использующий старый класс
class LoggerAdapter implements NewLogger {
    private LegacyLogger legacyLogger;

    public LoggerAdapter(LegacyLogger logger) {
        this.legacyLogger = logger;
    }

    @Override
    public void logMessage(String message) {
        // Адаптация вызова: используем уровень по умолчанию для старого метода
        legacyLogger.log(message, "INFO");
    }
}

// 4. Использование клиентом
public class Client {
    public static void main(String[] args) {
        NewLogger logger = new LoggerAdapter(new LegacyLogger());
        logger.logMessage("Application started"); // Вывод: [INFO]: Application started
    }
}

Почему это полезно: Позволяет повторно использовать существующий код, не изменяя его, и соблюдает принцип открытости/закрытости (Open/Closed Principle).