Designmønstre: Adapter. Strukturelle maler: Adapterklar kode for adaptere i java

    Adapter (designmønster)/kodeeksempler- Hovedartikkel: Adapter (designmønster) Et eksempel på en mønsterimplementering i C# ved bruk av System; navneområdeadapter ( klasse MainApp ( static void Main() ( ... Wikipedia

    Proxy-mønster (designmønster)

    Design mønster– Dette begrepet har andre betydninger, se Mønster. I programvareutvikling er et designmønster et repeterbart arkitektonisk design som representerer en løsning på et problem... ... Wikipedia

    Grensesnitt (designmønster)- Design mønster Grensesnitt Beskrevet i designmønstre Nei I informatikk er et grensesnittmønster ikke et spesielt mønster blant designmønstre. Det er en generell metode for strukturering dataprogrammer for det... Wikipedia

    Stedfortreder (designmønster)- Fullmaktsmønster (stedfortreder) Designmønster. Gir et tilgangskontrollerende objekt som avskjærer alle anrop til det. Innhold 1 Mål 1.1 Oppgave 1.2 Løsning 2 Fordeler 3 ... Wikipedia

    Guardian (designmønster)- Design Pattern Guardian Memento Type: Behavioral Beskrevet i Design Patterns Ja Guardian (også kjent som Memento, Token, Token) er et atferdsdesignmønster. Lar deg fikse uten å bryte innkapslingen... Wikipedia

    Iterator (designmønster)- Design Pattern Iterator Iterator Type: atferdsmessig Beskrevet i Design Patterns Ja Iterator Pattern (også kjent som markør) Et designmønster som refererer til atferdsmønstre. Det er et objekt som lar deg få ... Wikipedia

    Tolk (designmønster)- Designmønster Tolk Type: atferdsmessig Formål: løser et ofte forekommende, endringsutsatt problem Beskrevet i Design Patterns Ja Tolkemønster (engelsk ... Wikipedia

    Linker (designmønster)- Designmønster Kompositt Type: strukturell Beskrevet i Design Patterns Ja Sammensatt mønster er et designmønster, refererer til strukturelle mønstre, kombinerer et objekt ... Wikipedia

    Tilstand (designmønster)- Tilstand designmønster Type: atferdsmessig Beskrevet i designmønster Ja Tilstand er et designmønster. Den brukes i tilfeller der et objekt under kjøring av program ... Wikipedia

    Hovedartikkel: Adapter (designmønster) Eksempelimplementering av mønsteret i C# ved bruk av System; navneområdeadapter ( klasse MainApp ( static void Main() ( ... Wikipedia

    Dette begrepet har andre betydninger, se mønster. I programvareutvikling er et designmønster et repeterbart arkitektonisk design som representerer en løsning på et problem... ... Wikipedia

    Grensesnittdesignmønster Grensesnitt beskrevet i designmønstre Nei I informatikk er ikke grensesnittmønsteret et spesielt mønster blant designmønstre. Det er en generell metode for å strukturere dataprogrammer for å... Wikipedia

    Proxy Pattern Design mønster. Gir et tilgangskontrollerende objekt som avskjærer alle anrop til det. Innhold 1 Mål 1.1 Oppgave 1.2 Løsning 2 Fordeler 3 ... Wikipedia

    Design Pattern Guardian Memento Type: Atferd Beskrevet i Design Patterns Ja Guardian (også kjent som Memento, Token, Token) er et atferdsdesignmønster. Lar deg fikse uten å bryte innkapslingen... Wikipedia

    Design Pattern Iterator Iterator Type: Atferd Beskrevet i Design Patterns Ja Iterator Pattern (også kjent som markør) Et designmønster som refererer til atferdsmønstre. Det er et objekt som lar deg få ... Wikipedia

    Designmønster Tolk Type: atferdsmessig Formål: løser et ofte forekommende, endringsutsatt problem Beskrevet i Design Patterns Ja Tolkemønster (engelsk ... Wikipedia

    Designmønster Kompositt Type: strukturell Beskrevet i Design Patterns Ja Sammensatt mønster er et designmønster, refererer til strukturelle mønstre, kombinerer et objekt ... Wikipedia

    Designmønster Status Type: atferdsmessig Beskrevet i designmønstre Ja Tilstand er et designmønster. Den brukes i tilfeller der et objekt under kjøring av program ... Wikipedia

Før du leser, vennligst se gjennom følgende konvensjoner og konsepter. Denne artikkelen oppdateres med en viss frekvens, så hvis du har lest den før, er det ikke et faktum at dataene ikke har endret seg.

Adapter tilhører klassen strukturell mønstre. Den brukes til å konvertere ett grensesnitt til et annet som kreves av klienten. Adapteren sikrer kompatibilitet av inkompatible grensesnitt ved å implementere et lag.

Prinsipp for operasjon

Adapteren arver målgrensesnittet på en åpen måte (la oss kalle det Mål), og en lukket måte tilpasningsdyktig grensesnitt ( Tilpasset). I implementeringen av målgrensesnittmetodene blir forespørsler omdirigert (delegert) til en klasse med et tilpasningsbart grensesnitt

Eksempel

// Target-grensesnitt, klienten kan bare jobbe med dets grensesnitt iTarget ( public function query(); ) // Tilpassbart grensesnitt. Klienten vet ikke hvordan den skal jobbe med det, men vil virkelig ha grensesnitt iAdaptee ( public function request(); ) // En klasse som implementerer en tilpasningsbar grensesnittklasse Adaptee implementerer iAdaptee ( public function request() ( return __CLASS__ . ":: " . __METHOD__; ) ) klasse Adapter implementerer iTarget ( beskyttet $adaptee = null; offentlig funksjon __construct() ( $this -> adaptee = new Adaptee(); ) public function query() ( return $this -> adaptee -> request (); ) ) $ Target = new Adapter(); print $Target -> query(); // "Adaptee::request"

Konklusjon

En adapter kan tilpasse flere grensesnitt til ett på en gang; dette mønsteret kalles objektadapter Bruken av dette mønsteret er berettiget i flere tilfeller. Hvis du vil bruke en eksisterende klasse med et annet grensesnitt. Hvis du skal bruke det tilpasningsbare grensesnittet flere steder, og ikke har mulighet til å få det til å se likt ut overalt, så kan det være lurt å bruke utskiftbare adaptere.

Hensikten med adaptermønsteret

Ofte i nytt programvareprosjekt Kan ikke gjenbruke eksisterende kode. For eksempel kan eksisterende klasser ha ønsket funksjonalitet, men ha inkompatible grensesnitt. I slike tilfeller bør du bruke adaptermønsteret.

Adaptermønsteret, som er en programvareinnpakning over eksisterende klasser, konverterer grensesnittene deres til en form som passer for senere bruk.

La oss se på et enkelt eksempel på når adaptermønsteret skal brukes. La oss utvikle et klimakontrollsystem designet for automatisk å holde omgivelsestemperaturen innenfor angitte grenser. En viktig komponent Et slikt system er en temperatursensor, med hvilken omgivelsestemperaturen måles for påfølgende analyse. For denne sensoren er det allerede en ferdig programvare fra tredjepartsutviklere, som er en klasse med riktig grensesnitt. Du kan imidlertid ikke bruke denne klassen direkte, siden sensoravlesningene er tatt i grader Fahrenheit. Du trenger en adapter som konverterer temperaturen til Celsius.

Kø-, prioritetskø- og stabelbeholderne til standard STL-malbiblioteket implementeres på grunnlag av den sekvensielle listen, deque- og vektorbeholderne, og tilpasser grensesnittene til ønsket form. Det er derfor disse beholderne kalles adapterbeholdere.

Beskrivelse av adaptermønsteret

La klassen hvis grensesnitt må tilpasses ønsket form, hete Adaptee. For å løse problemet med å transformere grensesnittet, introduserer adaptermønsteret følgende klassehierarki:

  • Målrett virtuell baseklasse. Annonsert her brukergrensesnitt passende type. Bare dette grensesnittet er tilgjengelig for brukeren.
  • En avledet adapterklasse som implementerer Target-grensesnittet. Denne klassen inneholder også en peker eller referanse til en Adaptee-forekomst. Adaptermønsteret bruker denne pekeren til å videresende klientanrop til Adaptee. Siden Adaptee- og Target-grensesnittene er inkompatible med hverandre, krever disse samtalene vanligvis konvertering.

Implementering av Adapter-mønsteret

Klassisk implementering av Adapter-mønsteret

Her er en implementering av Adapter-mønsteret. For eksempelet ovenfor tilpasser vi avlesningene til temperatursensoren til klimakontrollsystemet, og konverterer dem fra grader Fahrenheit til grader Celsius (det antas at koden for denne sensoren ikke er tilgjengelig for modifikasjon).

#inkludere // Allerede eksisterende miljøtemperatursensor klasse klasse FahrenheitSensor ( offentlig: // Hent temperaturavlesninger i Fahrenheit float getFahrenheitTemp() ( float t = 32.0; // ... noen kode returnerer t; ) ); klasse Sensor ( offentlig: virtuell ~Sensor() () virtuell flytende getTemperature() = 0; ); klasse Adapter: offentlig Sensor ( offentlig: Adapter(FahrenheitSensor* p) : p_fsensor(p) ( ) ~Adapter() ( slett p_fsensor; ) float getTemperature() ( return (p_fsensor->getFahrenheitTemp()-32.0)*5.0/9.0 ; ) privat: FahrenheitSensor* p_fsensor; ); int main() (Sensor* p = ny adapter(ny FahrenheitSensor); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Implementering av Adapter-mønsteret basert på lukket arv

La temperatursensoren vår for klimakontrollsystemet støtte justeringsfunksjonen for mer nøyaktige avlesninger. Denne funksjonen er ikke nødvendig å brukes, og det er sannsynligvis grunnen til at den tilsvarende just()-metoden er erklært beskyttet av utviklerne i den eksisterende FahrenheitSensor-klassen.

Systemet vi utvikler skal støtte måltilpasning. Siden tilgang til en beskyttet metode gjennom en peker eller lenke er forbudt, er den klassiske implementeringen av Adapter-mønsteret ikke lenger egnet her. Den eneste løsningen er å arve fra FahrenheitSensor-klassen. Grensesnittet til denne klassen må forbli utilgjengelig for brukeren, så arven må være privat.

Målene som tilstrebes ved bruk av åpen og lukket arv er forskjellige. Mens åpen arv brukes til grensesnitt og implementeringsarv, brukes lukket arv kun for implementeringsarv.

#inkludere class FahrenheitSensor ( public: float getFahrenheitTemp() ( float t = 32.0; // ... return t; ) protected: void adjust() () // Juster sensoren (beskyttet metode) ); klasse Sensor ( offentlig: virtuell ~Sensor() () virtuell flytende getTemperature() = 0; virtual void adjust() = 0; ); klasse Adapter: offentlig Sensor, privat FahrenheitSensor ( offentlig: Adapter() ( ) float getTemperature() ( return (getFahrenheitTemp()-32.0)*5.0/9.0; ) void adjust() ( FahrenheitSensor::adjust(); ) ); int main() ( Sensor * p = new Adapter(); p->adjust(); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Resultater av bruk av adaptermønsteret

Fordeler med adaptermønsteret

  • Adaptermønsteret lar deg gjenbruke eksisterende kode ved å tilpasse det inkompatible grensesnittet til en brukbar form.

Ulemper med adaptermønsteret

  • Oppgaven med å konvertere grensesnitt kan være vanskelig dersom klientanrop og/eller beståtte parametere ikke har en funksjonell korrespondanse i objektet som tilpasses.

Hei alle sammen! I dag skal vi snakke om Mønsteradapter designmønster. Som navnet tilsier, tjener det til å sikre at noe tilpasse, men hva? Og denne artikkelen vil svare på dette spørsmålet for deg.

Beskrivelse av adapterens designmønster

La oss gå litt bort fra programmering og se på adaptere i det virkelige liv. Du har for eksempel kjøpt noe utstyr (for eksempel en datamaskin) i utlandet. Etter å ha kommet hjem med den, oppdaget du at støpselet av en annen standard ikke passet inn i vår russiske stikkontakt. Hva å gjøre? Ikke sant! Du må gå til butikken og kjøpe adapter, som du kan bruke til å koble datamaskinen til nettverket. Så denne adapter og det er adapter. Vi setter inn en fremmed plugg i den, og plugger selve adapteren inn i nettverket og alt fungerer utmerket. De. det tjener rett og slett lag mellom vår kontakt og fremmedstøpsel.

Så jeg tror du har funnet ut av det hva er en adapter i livet. I programmering er det det samme.

Eksempel på adapterimplementering i PHP

grensesnitt iMain (
offentlig funksjon send();
}

Interface iAdaptee (
offentlig funksjonsforespørsel();
}

Klasse Adaptee implementerer iAdaptee (
offentlig funksjonsforespørsel() (
returner __KLASSE__."::".__METHOD__;
}
}

Klasseadapter implementerer iMain (
beskyttet $adaptee = null;

Offentlig funksjon __construct() (
$this->adaptee = new Adaptee();
}

Offentlig funksjon send() (
returner $this->adaptee->inquiry();
}
}

$goal = ny adapter();
echo $goal->send(); // "Adaptee::forespørsel"
?>

Så her er koden vår. La oss finne ut av det. Vi har et grensesnitt iMain, kan klientkoden fungere med den. Deretter har vi grensesnittet iAdaptee, som klientkoden ikke kan fungere med, men vi må på en eller annen måte samhandle med den. Så har vi time Tilpasset iAdaptee og inne har den en metode som heter forespørsel, som ganske enkelt returnerer en streng som KLASSE::METODE. Her kommer vi til klassen Adapter, som arver grensesnittet iMain. Inne i den skaper vi en vernet eiendom tilpasset, lik null. Deretter lager vi et klasseobjekt i konstruktøren Tilpasset og skriv det til vår vernede eiendom. I metode sende vi returnerer metodekallet forespørsel.

Det er alt. Nå lager vi adapterobjektet vårt og kaller metoden sende.

De. hele poenget er at vi kan jobbe med ett grensesnitt, men ikke med et annet, og for på en eller annen måte å samhandle med dette grensesnittet som er utilgjengelig for oss, lager vi adapter, et lag som vi gjennomfører oppgaven vår gjennom.

Konklusjon

Nå kan det virke for deg at alt er veldig komplisert og vanskelig, men det er ikke slik. Jeg tror du forstår meningen med adapteren, men nå trenger du mer øvelse. Ta en titt på koden gitt i denne artikkelen igjen og prøv å forstå den. Gå gjennom det linje for linje og resiter det som om du var en tolk php. Jeg anbefaler deg også å se på koden til et eller annet rammeverk, fordi denne malen brukes der ganske ofte.

Dette avslutter denne ganske lange artikkelen, takk for oppmerksomheten!