Адаптер (шаблон)

Адаптер (на английски: Adapter) е структурен шаблон за дизайн, който се използва в обектно-ориентираното програмиране. Той позволява интерфейсът на даден клас да бъде използван от друг интерфейс. Често се ползва при необходимост съществуващи класове да работят с други, без да се променя техният изходен код.
Най-простото определение за адаптер е инструмент, който прави възможна работата на два несъвместими интерфейса. Интерфейсите могат да бъдат несъвместими, но вътрешните функционалности трябва да отговарят на приложението. Адаптерът позволява иначе несъвместими класове да работят заедно чрез превръщането на интерфейса на един от класовете в интерфейс с вид, очакван от клиента.
Съществуват два вида адаптери:
Адаптерът е полезен в ситуации, в които един вече съществуващ клас осигурява някои или всички необходими услуги, но не използва необходимия интерфейс. Един добър пример от реалния живот е адаптер, който преобразува интерфейса на Document Object Model на XML документ в дървовидна структура, която може да бъде показана.
Съществува и допълнителна форма на изпълнение на Адаптер както следва:
Казано е за клас А да подаде някакви данни на клас B. Да допуснем, че това са данни от типа низ. Решението за компилация е:
Въпреки това, да предположим, че форматът на данните от тип низове трябва да се промени. Решението е да се използва наследяване:
и да се създаде правилно „форматиране“ на обекта по време на изпълнение с помощта на адаптера Factory.
Решение използващо „шаблони“ се изпълнява по следния начин:
(i) дефиниране на посредник „Доставчик“ интерфейс, изписване имплементация за изпълнение на този „Доставчик“ интерфейс, който обвива източника на данните (Class A В този пример) и извеждане данните форматирани по целесъобразност:
(ii) изписване на адаптер клас, който връща характерната имплементация на „Доставчика“:
(iii) регистриране на адаптера с глобален регистър, така че адаптерът да може да бъде видян по време на изпълението:
(iv) Пренасяне на данни от клас А в клас Б:
или по-добре формулирано:
(v) предимството може да бъде видяно в това, ако решим да пренесем данните във втори формат. Тогава да погледнем различния адаптер/доставчик:
или ако желаем да изведем данните от клас А, да кажем, като снимки в клас С:
(vii) По този начин използването на адаптери и доставчици позволява множество „изгледи“ от клас C и клас A към клас B, без да се налага да се променя йерархията на класа. Като цяло, това позволява механизма за произволни потоци данни между обекти да бъдат монтирани на съществуваща йерархия.
При прилагането на адаптер за по-голяма яснота може да се прилага името на класа [име на класа] до [Interface] адаптера за прилагане на имплементацията. За пример – DAOToProviderAdapter. Тя трябва да има метод конструктор с променлива от тип adaptee като параметър. Този параметър ще бъде приет за член на инстанция на [име на класа] до [Interface] адаптер. Когато clientMethod се извика той ще има достъп до adaptee инстанцията, която дава възможност за достъп до необходимите данни на adaptee и извършване на операции по тези данни, което генерира желания изход.
Имплементация в Scala:
Терминът лепило код понякога се използва за описване на реализации на модела на адаптера. Тя не допринася на изчисленията или компилацията. Тя по-скоро служи като прокси между иначе несъвместими части на софтуер, за да ги направят съвместими. Стандартната практика е да се запази логиката на лепило кода и да се остави това на кода към който се свързва.