Sobes.tech
Junior

Какво е патърнът Адаптер?

sobes.tech AI

Отговор от AI

Моделът адаптер (Adapter Pattern) е структурен шаблон за дизайн, който позволява на класове с несъвместими интерфейси да работят заедно. Той действа като обвивка, която преобразува интерфейса на един клас в друг, очакван от клиента.

Приложения:

  • Интеграция на външни библиотеки с несъвместими интерфейси.
  • Използване на съществуващи класове в нови системи без да се модифицират.
  • Осигуряване на взаимодействие между независимо разработени класове.

Пример за реализация (обектен адаптер):

Да предположим, че съществува клас LegacyService с метод oldRequest():

class LegacyService {
    public void oldRequest() {
        // стар код
    }
}

И нов интерфейс NewService с метод newRequest():

interface NewService {
    void newRequest();
}

Адаптерът ServiceAdapter реализира NewService и съдържа препратка към LegacyService:

class ServiceAdapter implements NewService {
    private LegacyService legacyService;

    public ServiceAdapter(LegacyService legacyService) {
        this.legacyService = legacyService;
    }

    @Override
    public void newRequest() {
        // Преобразуване на извикването на новия метод към стария
        legacyService.oldRequest();
    }
}

Клиентът може да използва LegacyService чрез интерфейса NewService:

NewService service = new ServiceAdapter(new LegacyService());
service.newRequest(); // Ще извика oldRequest() в LegacyService

Съществува и вариация — класов адаптер, който използва множествено наследяване (ако езикът го поддържа) или наследяване от адаптирания клас и реализиране на целевия интерфейс. В Java, поради липсата на множествено наследяване, това се реализира чрез наследяване от адаптирания клас и реализиране на адаптерния интерфейс, но този подход е по-малко гъвкав. Обектният адаптер е по-препоръчителен, тъй като позволява адаптиране на подкласове и избягва твърда връзка.

Предимства:

  • Позволява повторна употреба на несъвместими класове.
  • Инкапсулира детайлите по преобразуване на интерфейсите.
  • Повишава гъвкавостта на системата.

Недостатъци:

  • Може да увеличи сложността, като добави нов клас.
  • Производителността може леко да се понижи поради допълнително ниво на абстракция.