Sobes.tech
Junior

Kas yra adapterio modelis?

sobes.tech AI

Atsakymas iš AI

Adapterio šablonas (Adapter Pattern) — struktūrinis dizaino šablonas, leidžiantis nesuderinamiems klasių sąsajoms dirbti kartu. Jis veikia kaip apvalkalas, kuris paverčia vieno klases sąsają į kitą, kurios tikisi klientas.

Pritaikymas:

  • Trečiųjų šalių bibliotekų integracija su nesuderinamomis sąsajomis.
  • Esamų klasių naudojimas naujuose sistemose be jų modifikavimo.
  • Sąveikos užtikrinimas tarp nepriklausomai sukurtų klasių.

Implementacijos pavyzdys (objektinis adapteris):

Įsivaizduokime, kad yra esama klasė LegacyService su metodu oldRequest():

class LegacyService {
    public void oldRequest() {
        // sena kodas
    }
}

Ir nauja sąsaja NewService su metodu newRequest():

interface NewService {
    void newRequest();
}

Adapteris ServiceAdapter įgyvendina NewService ir turi nuorodą į LegacyService:

class ServiceAdapter implements NewService {
    private LegacyService legacyService;

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

    @Override
    public void newRequest() {
        // Naujo metodo iškvietimo paversti į seno
        legacyService.oldRequest();
    }
}

Klientas gali naudoti LegacyService per sąsają NewService:

NewService service = new ServiceAdapter(new LegacyService());
service.newRequest(); // Iškvies `oldRequest()` `LegacyService`

Taip pat yra variacija — klasės adapteris, kuris naudoja daugialypį paveldėjimą (jei kalba tai palaiko) arba paveldėjimą iš adaptuojamos klasės ir įgyvendina tikslinę sąsają. Java, dėl daugybinio paveldėjimo nebuvimo, tai įgyvendinama per paveldėjimą iš adaptuojamos klasės ir adapterio sąsajos įgyvendinimą, tačiau toks požiūris yra mažiau lankstus. Objektinis adapteris yra pageidautinas, nes leidžia pritaikyti pogrupius ir išvengti griežtos ryšio.

Privalumai:

  • Leidžia naudoti nesuderinamus klases kartu.
  • Užslėpia sąsajų transformavimo detales.
  • Didina sistemos lankstumą.

Trūkumai:

  • Gali padidinti sudėtingumą, pridedant naują klasę.
  • Gali šiek tiek sumažinti našumą dėl papildomo abstrakcijos lygio.