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();
    }
}

Հաճախորդը կարող է օգտագործել LegacyServiceNewService ինտերֆեյսի միջոցով:

NewService service = new ServiceAdapter(new LegacyService());
service.newRequest(); // Կոչում է oldRequest() `LegacyService`-ում

Կա նաև տարբերակ՝ դասային ադապտեր, որը օգտագործում է բազմաբնույթ ժառանգություն (եթե լեզուն աջակցում է) կամ ժառանգություն ադապտացվող դասից և նպատակային ինտերֆեյսի իրականացմանը։ Java-ում, քանի որ բազմաբնույթ ժառանգությունը չի աջակցվում, դա իրականացնում է ժառանգությամբ ադապտացվող դասից և ադապտերային ինտերֆեյսի իրականացման միջոցով, բայց այդ մոտեցումը պակաս ճկուն է։ Օբյեկտային ադապտերը ավելի նախընտրելի է՝ հնարավորության պատճառով հարմարեցնել ենթակլասները և խուսափել խիստ կապից։

Առավելություններ՝

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

Недостатки:

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