Идея паттерна Адаптер (Adapter)

Паттерн (шаблон) проектирования — это продуманный способ построения исходного кода программы для решения часто возникающих в повседневном программировании проблем проектирования. Иными словами, это уже придуманное решения, для типичной задачи. При этом паттерн не готовое решение, а просто алгоритм действий, который должен привести к желаемому результату. Давайте рассмотрим один из наиболее часто используемых структурных паттернов — Адаптер (Adapter).

Как я уже писал ранее, существует три вида паттернов проектирования:

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

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

Архитектура паттерна Адаптер (Adapter)

Давайте рассмотрим диаграмму паттерна.

Adapter UML

Adapter UML

  • Target — целевой интерфейс, к которому нужно преобразовать интерфейс существующих классов;
  • Adaptee — существующий класс, чей интерфейс нужно преобразовать;
  • Adapter — класс-адаптер, который преобразует интерфейс адаптируемого класса к целевому;
  • Client — клиенты нового интерфейса, которые работают с адаптированными классами полиморфным образом.

Логика работы паттерна Адаптер (Adapter)

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

Реализация паттерна проектирования Адаптер (Adapter) на языке C#

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

Реализуем данный интерфейс в обычном кассовом аппарате.

Теперь создадим в проекте новую библиотеку классов (.dll), которая будет символизировать иностранный кассовый аппарат, предоставляющий совершенно другой интерфейс взаимодействия. Добавим в созданную библиотеку два класса иностранного кассового аппарата и чека, используемого в нем.

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

Теперь нам остается только проверить работу кассовых аппаратов на практике. Для этого реализуем следующий вызов.

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

Adapter result

Adapter result

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

Adapter struct

Adapter struct

Исходный код приложения можно скачать из репозитория https://github.com/shwanoff/adapter/.

Рекомендую также изучить статью Паттерн Декоратор (Decorator)

P.S. Присоединяйся в любой удобной для тебя социальной сети. Для меня очень важно оставаться с тобой на связи, ведь у меня есть еще много полезной информации о программировании для тебя, которой я хочу с тобой поделиться.
[DISPLAY_ULTIMATE_PLUS]

%d такие блоггеры, как: