Разница между адаптером и оберткой

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

Определение

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

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

Отличия

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

Пример

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

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

Однако ваша двухштырьковая вилка не совместима с трехштырьковой настенной розеткой. Вам нужен адаптер, чтобы сопоставить интерфейс 2-контактной вилки с интерфейсом 3-контактной розетки.

Давайте посмотрим код!

Представьте, что новая функция вашего приложения должна быть интегрирована с социальными сетями, чтобы получать базовую информацию о пользователе. Класс FacebookConnector будет оболочкой для Facebook. Это облегчает ваше подключение к Facebook. Вместо того, чтобы обращаться к SDK Facebook, который раскрывает множество различных вариантов использования, вы создаете класс, который взаимодействует с SDK за вас и предоставляет только то, что вам нужно. У меня есть оболочка Facebook, которую я использовал для приложения Swift в моем профиле Github.

Что, если вы знаете, что вам нужны некоторые данные из социальных сетей — адрес электронной почты пользователя, полное имя, возможно, изображение профиля или личное описание? Вы не знаете, с какими именно социальными сетями вы хотели бы интегрироваться. Откровенно говоря, вам все равно, пока вы можете получить необходимую информацию. В этом сценарии вы должны создать интерфейс ISocialIntegrator, определенный на C# следующим образом:

interface ISocialIntegrator 
{ 
  void Connect(); 
  string Email { get; } 
  string FullName { get; } 
  string Description { get; } 
}

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

Теперь, когда вы определили интерфейс, с которым будет взаимодействовать остальная часть вашего кода, вы можете начать разработку интерфейса, не беспокоясь о его фактической реализации. После двух-трех заслуженных кружек пива, выбрав конкретную социальную сеть, которую вы хотели бы использовать, вы можете создать адаптер между интерфейсом SocialIntegrator и выбранной вами социальной сетью. Вы можете создать FacebookAdapter, LinkedInAdapter и т. д., которые будут соответствовать интерфейсу SocialIntegrator и ликвидировать разрыв между необходимой вам общей информацией и фактическим API выбранной вами социальной сети.

Резюме

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

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

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

Первоначально опубликовано на сайте thecodedself.github.io 30 января 2017 г.