Modelul adaptorului

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Numele adaptor sau adaptor denotă un model de proiectare utilizat în informatică în programarea orientată pe obiecte . Uneori se numește înveliș (sau carcasă) pentru schema sa de funcționare .

Scopul adaptorului este de a oferi o soluție abstractă la problema interoperabilității între diferite interfețe. Problema apare ori de câte ori într-un proiect software este necesar să se utilizeze sisteme de suport (cum ar fi bibliotecile ) a căror interfață nu este perfect compatibilă cu ceea ce este cerut de aplicațiile deja existente. În loc să fie necesar să rescrieți o parte a sistemului, o sarcină oneroasă și nu întotdeauna posibilă dacă codul sursă nu este disponibil, poate fi convenabil să scrieți un adaptor care să acționeze ca intermediar.

Adaptorul este un model structural care poate fi bazat atât pe clase, cât și pe obiecte .

Acest model de design este o parte fundamentală a programării orientate pe obiecte și a fost formalizat pentru prima dată de Erich Gamma , Richard Helm , Ralph Johnson și John Vlissides - așa-numita Gang of Four - în cartea Design Patterns .

Aplicabilitate

Utilizarea modelului adaptor este utilă atunci când interfețele din clase diferite trebuie să poată comunica între ele. Unele cazuri pot include

  • utilizarea unei clase existente care prezintă o altă interfață decât cea dorită;
  • scrierea unei clase date fără a putea cunoaște a priori celelalte clase cu care va trebui să funcționeze, în special fără a putea cunoaște ce interfață specifică este necesar ca clasa să le prezinte celorlalți.

Un alt context este acela în care doriți ca invocarea unei metode a unui obiect de către clienți să aibă loc numai indirect: metoda „țintă” este încapsulată în interiorul obiectului, în timp ce una sau mai multe metode „publice” acționează ca intermediar cu exteriorul lume. Acest lucru permite clasei să sufere modificări viitoare, păstrând în același timp compatibilitatea înapoi, sau să implementeze într-un singur punct o funcționalitate pe care clienții o accesează prin metode mai „confortabile” de utilizat și cu semnături diferite.

Structura

Modelul adaptorului se poate baza pe clase, folosind moștenirea multiplă pentru a adapta diferite interfețe cu mecanismul moștenirii sau pe obiecte cu compoziția, adică incluzând obiectul sursă în implementarea adaptorului.

Participanți

Diagrama UML a modelului
  • Adaptee : definește interfața care trebuie adaptată.
  • Țintă : definește interfața pe care o folosește Clientul.
  • Client : Colaborați cu obiecte în conformitate cu interfața țintă.
  • Adaptor : adaptează interfața Adaptee la interfața țintă.

Elemente conexe

Exemple

PHP

 // Exemplu de model de adaptor

interfață socket IFormatGerman
{
    funcție publică insertSpinaGerman ();
    funcția publică sendCurrent ();
}

interfață IFormatPresaItaliana
{
    funcție publică insertSpinaItaliana ();
    funcția publică sendCurrent ();
}

// Adaptee
Mașina de spălat clasă germană implementează IFormat
{
    private $ plugInserted = FALS ;
    private $ currentPresente = FALS ;
    
    funcție publică insertGerman plug ()
    {
        $ this -> plugInserted = TRUE ;
        ecou "Conector german introdus \ n " ;
    }
    
    funcție publică sendCurrent ()
    {
        if ( $ this -> plugInserted )
        {
            $ this -> currentPresente = ADEVĂRAT ;
            ecou "Mașina de spălat germană actuală este prezentă \ n " ;
        }
        altceva
        {
            ecou "curentul mașinii de spălat germane nu este prezent \ n " ;
        }
    }
    
    funcții publice spală ()
    {
        if ( $ this -> currentPresent )
        {
            ecou „S-a început spălarea \ n  ;
            ecou „Spălare 25% \ n  ;
            ecou „Spălare 50% \ n  ;
            ecou „Spălare 75% \ n  ;
            ecou „Spălare terminată \ n  ;
        }
        altceva
        {
            ecou „Verificați soclul \ n  ;
        }
    }
}

// Adaptor
Clasa GermanSocket Adapter implementează soclul IFormatItalian
{
    private $ luate ;

    funcția publică __construct (IFormatPresaGerman $ soclu)
    {
        $ this -> take = $ take ;
    }

    funcție publică insertSpinaItaliana ()
    {
        echo "Adaptor de priză german introdus \ n " ;
        $ this -> socket -> insert german plug ();
    }

    funcție publică sendCurrent ()
    {
        $ this -> take -> sendCurrent ();
    }
    
    funcții publice spală ()
    {
        $ this -> take -> lava ();
    }
}

clasa Mașină de spălatItaliana implementează IFormatPresaItaliana
{
    private $ currentPresente = FALS ;
    private $ plugInserted = FALS ;
    
    funcție publică insertSpinaItaliana ()
    {
        $ this -> plugInserted = TRUE ;
        ecou „mufa italiană introdusă \ n  ;
    }
    
    funcție publică sendCurrent ()
    {
        if ( $ this -> plugInserted )
        {
            $ this -> currentPresente = ADEVĂRAT ;
            ecou "Mașina de spălat italiană actuală este prezentă \ n " ;
        }
        altceva
        {
            ecou "curentul mașinii de spălat italiene nu este prezent \ n " ;
        }
    }
    
    funcții publice spală ()
    {
        if ( $ this -> currentPresent )
        {
            ecou „S-a început spălarea \ n  ;
            ecou „Spălare 25% \ n  ;
            ecou „Spălare 50% \ n  ;
            ecou „Spălare 75% \ n  ;
            ecou „Spălare terminată \ n  ;
        }
        altceva
        {
            ecou „Verificați soclul \ n  ;
        }
    }
}

// Client
clasa RunWash
{
    mașină de spălat privată $ ;
    private $ washerWithAdapter ;

    funcție publică __construct ()
    {
        ecou "--- Spălarea germană a început --- \ n " ;
        $ this -> mașină de spălat = mașină de spălat germană nouă ();
        $ this -> mașină de spălat ConAdapt = nou adaptor GermanSocket ( $ this -> mașină de spălat );
        $ this -> mașină de spălat cu adaptor -> insertSpinaItaliana ();
        $ This -> machineWithAdapter de spălat -> sendCurrent ();
        $ this -> machine WashWithAdapter -> washing ();
        ecou "--- Îmbrăcăminte gata --- \ n \ n " ;
    }
}

$ spălare = nou RunWash ();

// Rezultat: # quanton81

// --- Spălarea germană a început ---
// Adaptor de priză german introdus
// Fișă germană introdusă
// Mașina de spălat germană actuală este prezentă
// A început spălarea
// Spălare 25%
// Spălare 50%
// Spălare 75%
// Spălarea terminată
// --- Haine gata facute ---

Alte proiecte