Шаблон проектирования адаптера берет интерфейс и делает его совместимым с другим интерфейсом.

Скажем, у нас есть исходный код (интерфейс и его подклассы). Наш интерфейс исходного кода делает запрос к интерфейсу сторонней библиотеки. Оба интерфейса взаимодействуют друг с другом и отлично работают синхронно.

Но появился новый поставщик и написал новую стороннюю библиотеку (интерфейс). Новый интерфейс сторонней библиотеки принимает конкретные запросы вместо общих запросов.

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

Сейчас мы застряли на том, как оба интерфейса будут взаимодействовать, как добиться совместимости. Ну, вот тогда и появится адаптер. Переходник будет стоять между обоими интерфейсами. Адаптер примет общий запрос из исходного кода, а затем преобразует его в специальный запрос.

Адаптер действует как переводчик для обеспечения совместимости

Скажем, пользователь или клиент запросил метод запроса интерфейса Target. Этот метод запроса к цели от клиента хочет получить доступ к определенному запросу. Но интерфейс Target, в свою очередь, не знает, как получить доступ кspecificRequest. Интерфейс Target несовместим с интерфейсом Adaptee. Интерфейс Target не знает, как общаться с интерфейсом Adaptee. Интерфейс Target не знает, как вызвать определенный запрос.

Целевой интерфейс не может выполнить запрос Клиента.

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

Интерфейс Adaptee (и его подклассы) будет адаптирован к Target с помощью адаптера.

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

new NationalGeographic().watchShow(); new Discovery().watchShow()

Класс Parents может просто создать объект классов Discovery и National Geographic для вызова метода watchShow.

Но мои родители не могут получить доступ к OTT-приложениям на Smart TV. Мои родители не знают, как зайти на ОТТ и потом смотреть передачи. Мои родители не знают, как сделать запрос к методу loginAndWatchShow.

Также интерфейс TVChannel и OTT несовместимы друг с другом. Телеканал не умеет разговаривать с ОТТ. TVChannel не знает, как преобразовать запрос watchShow моих родителей в loginAndWatchShow OTT.

Ну тогда ОТТАдаптер зайдет и внедрит TVChannel. OTTAdapter переопределит watchShow для TVChannel и вызовет loginAndWatchShow для OTT. (Сделка обоих интерфейсов совместимыми)

Клиент и адаптируемый никогда не взаимодействуют. Class Parents не взаимодействует с интерфейсом OTT.

Definition: The adapter pattern convert the interface(OTT) of a class(AmazonPrime) into another interface(Target TVChannel) clients expect. Adapter lets classes(Discovery and AmazonPrime) work together that couldn’t otherwise because of incompatible interfaces.
Application: Use the Adapter class when you want to use some existing class (AmazonPrime or HotStar), but its interface(OTT) isn’t compatible with the rest of your code(Target TVChannel).
Imagine that you’re creating a stock market monitoring app. The app downloads the stock data from multiple sources in XML format and then displays nice-looking charts and diagrams for the user. At some point, you decide to improve the app by integrating a smart 3rd-party analytics library. But there’s a catch: the analytics library only works with data in JSON format.

Есть ли у вас какие-нибудь истории о шаблонах проектирования адаптеров из вашей жизни, дайте мне знать в комментариях? Увидимся в следующий раз!