Ответ
Паттерн Адаптер (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).