Паттерн Адаптер (Adapter) в Java

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

Примеры из реального мира:

  • Предположим, что на вашей карте памяти есть несколько снимков, и вам необходимо перенести их на компьютер. Для их передачи вам нужен какой-то адаптер, совместимый с портами вашего компьютера, чтобы вы могли подключить карту памяти к вашему компьютеру. В этом случае карт-ридер является адаптером.
  • Другим примером будет известный адаптер питания; вилка с тремя ножками не может быть подключена к розетке с двумя выводами, для этого необходимо использовать адаптер питания, который делает его совместимым с розеткой с двумя выводами.
  • Еще одним примером будет переводчик, переводящий слова, сказанные одним человеком другому.

Проще говоря паттерн адаптер позволяет обернуть несовместимый в противном случае объект в адаптер, чтобы сделать его совместимым с другим классом.

В разработке программного обеспечения паттерн адаптер является паттерном проектирования программного обеспечения, который позволяет использовать интерфейс существующего класса в качестве другого интерфейса. Он часто используется для того, чтобы существующие классы работали с другими без изменения их исходного кода.

Используйте паттерн адаптер, когда:

  • вы хотите использовать существующий класс, и его интерфейс не соответствует тому, который вам нужен
  • вы хотите создать повторно используемый класс, который взаимодействует с несвязанными или непредвиденными классами, то есть классами, которые не обязательно имеют совместимые интерфейсы
  • вам нужно использовать несколько существующих подклассов, но нецелесообразно адаптировать их интерфейс путем создания подклассов для каждого из них. Адаптер объекта может адаптировать интерфейс своего родительского класса.
  • большинство приложений, использующих сторонние библиотеки, используют адаптеры в качестве промежуточного уровня между приложением и сторонней библиотекой для отделения приложения от библиотеки. Если необходимо использовать другую библиотеку, для новой библиотеки требуется только адаптер без изменения кода приложения.

Пример паттерна адаптер на Java

Существует интерфейс Road

public interface Road {
    void run();
}

Класс Runner принимает и использует классы, реализующие интерфейс Road

public class Runner {
    private Road road;

    public Runner(){}

    public Runner(Road road){
        this.road = road;
    }

    public void runOnTheRoad() {
        System.out.println("Let's run");
        road.run();
        System.out.println("Finish");
    }
}

Существует класс IceRoad, который не реализует интерфейс Road, но нам требуется использовать его в качестве Road

public class IceRoad {
    void walk() {
        System.out.println("Someone walk on the ice road");
    };
}

Создаем класс адаптер IceRoadAdapter, реализующий интерфейс Road, но содержащий внутри класс IceRoad.

public class IceRoadAdapter implements Road {
    private IceRoad road;

    public IceRoadAdapter() {
        road = new IceRoad();
    }

    public void run() {
        road.walk();
    }
}

Используем класс адаптер IceRoadAdapter для класса Runner.

public class App {
    public static void main(String[] args){
        Runner runner = new Runner(new IceRoadAdapter());
        runner.runOnTheRoad();
    }
}


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки