Паттерн Адаптер

Паттерн Адаптер – структурный шаблон проектирования, предназначенный для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс. Паттерн адаптер предусматривает создание класса-оболочки с требуемым интерфейсом. Является, наверное, одним из самых часто употребляемых шаблонов проектирования, который можно встретить практически в любой программе, причем применяется программистами зачастую неосознанно и позволяет эффективно устранять проблему дублирования кода в определенных ситуациях. Одну из таких ситуаций мы рассмотрим далее.

Паттерн Адаптер
Паттерн Адаптер

Реализация: предположим, что мы работаем на заводе по производству машин в Германии и у нас есть интерфейс машин, которые мы производим:

Как видим, наша машина умеет ездить, а еще у нее установлен ксенон которая она может включать и выключать. Всю работу по управлению ездой и фарами берет на себя центральный процессор машины:

В конструктор нашего процессора мы будем передавать объект созданной машины и вся магия будет происходить в методе work(), в котором мы поочередно будем вызывать все три метода реализованных в классе AudiA3drive(), xenonOn(), xenonOff(). Давайте понаблюдаем за работой нашей машины:

Вывод:
AudiA3 rides!
AudiA3 xenon on
AudiA3 xenon off

Все работает просто и надежно как швейцарские часы. Но недавно мы узнали при запуске производства машин в России, был разработан другой класс машин, который учитывал национальные особенности, в частности в России запрещен ксенон и при производстве в машины устанавливаются обычные фары:

Как видим, методы управления машиной отличаются и у нас есть два варианта, создать новый класс процессора автомобиля или воспользоваться классом адаптером, мы выберем второй вариант:

Класс адаптера реализует интерфейс базовой машины. Адаптируемый объект (в нашем случае машины, сделанные в России) мы передаем в конструкторе класса. Метод drive() абсолютно идентичен в машинах произведенных в Германии и России (AudiA3 и AudiA3Rus соответственно), поэтому мы просто в методе drive() запускаем метод drive() из класса AudiA3Rus:

Так как в машины произведенные в России ксенон не устанавливается в методах xenonOn() и xenonOff() вступает в действие механизм адаптера – мы вызываем в них методы basicLightOn() и basicLightOff(). Давайте посмотрим, как это работает:

Вывод:
AudiA3 rides!
AudiA3 xenon on
AudiA3 xenon off
AudiA3Rus rides!
AudiA3Rus basic light on
AudiA3Rus basic light off

Как Вы можете заметить автомобильный процессор по прежнему запускает методы xenonOn() и xenonOff(), но благодаря классу-адаптеру на самом деле используются методы basicLightOn() и basicLightOff() класса AudiA3Rus.



Паттерн Адаптер полный код примера:

Site Footer