Designmönster: Adapter. Strukturella mallar: Adapter Ready-kod för adaptrar i java
Adapter (designmönster)/kodexempel- Huvudartikel: Adapter (designmönster) Ett exempel på en mönsterimplementering i C# med System; namnområdesadapter (klass MainApp ( static void Main() ( ... Wikipedia
Proxymönster (designmönster)
Design mönster- Denna term har andra betydelser, se Mönster. Inom mjukvaruutveckling är ett designmönster en repeterbar arkitektonisk design som representerar en lösning på ett problem... ... Wikipedia
Gränssnitt (designmönster)- Design mönster Gränssnitt Beskrivs i designmönster Nej Inom datavetenskap är ett gränssnittsmönster inte ett speciellt mönster bland designmönster. Det är en generell metod för strukturering datorprogram för det... Wikipedia
Suppleant (designmönster)- Proxymönster (ställföreträdande) Designmönster. Tillhandahåller ett åtkomstkontrollerande objekt som avlyssnar alla anrop till det. Innehåll 1 Mål 1.1 Uppgift 1.2 Lösning 2 Fördelar 3 ... Wikipedia
Guardian (designmönster)- Design Pattern Guardian Memento Typ: Beteende Beskrivs i designmönster Ja Guardian (även känd som Memento, Token, Token) är ett beteendedesignmönster. Låter dig fixa utan att bryta inkapslingen... Wikipedia
Iterator (designmönster)- Designmönster Iterator Iterator Typ: beteende Beskrivs i designmönster Ja Iteratormönster (även känd som markör) Ett designmönster som refererar till beteendemönster. Det är ett objekt som låter dig få ... Wikipedia
Tolk (designmönster)- Designmönster Tolk Typ: beteende Syfte: löser ett ofta förekommande, förändringsbenäget problem Beskrivet i Designmönster Ja Tolkmönster (engelska ... Wikipedia
Linker (designmönster)- Designmönster Komposittyp: strukturell Beskrivs i designmönster Ja Kompositmönster är ett designmönster, hänvisar till strukturella mönster, kombinerar ett objekt ... Wikipedia
Tillstånd (designmönster)- Tillståndsdesignmönster Typ: beteende Beskrivs i designmönster Ja Tillstånd är ett designmönster. Det används i de fall där, under programkörning, ett objekt ... Wikipedia
Huvudartikel: Adapter (designmönster) Exempelimplementering av mönstret i C# med hjälp av System; namnområdesadapter (klass MainApp ( static void Main() ( ... Wikipedia
Denna term har andra betydelser, se Mönster. Inom mjukvaruutveckling är ett designmönster en repeterbar arkitektonisk design som representerar en lösning på ett problem... ... Wikipedia
Gränssnittsdesignmönster Gränssnitt som beskrivs i designmönster Nej Inom datavetenskap är gränssnittsmönstret inte ett speciellt mönster bland designmönster. Det är en allmän metod för att strukturera datorprogram för att... Wikipedia
Proxy mönster design mönster. Tillhandahåller ett åtkomstkontrollerande objekt som avlyssnar alla anrop till det. Innehåll 1 Mål 1.1 Uppgift 1.2 Lösning 2 Fördelar 3 ... Wikipedia
Designmönster Guardian Memento Typ: Beteende Beskrivs i designmönster Ja Guardian (även känd som Memento, Token, Token) är ett beteendedesignmönster. Låter dig fixa utan att bryta inkapslingen... Wikipedia
Designmönster Iterator Iterator Typ: Beteende Beskrivs i designmönster Ja Iteratormönster (även känd som markör) Ett designmönster som refererar till beteendemönster. Det är ett objekt som låter dig få ... Wikipedia
Designmönster Tolk Typ: beteende Syfte: löser ett ofta förekommande, förändringsbenäget problem Beskrivet i Designmönster Ja Tolkmönster (engelska ... Wikipedia
Designmönster Komposittyp: strukturell Beskrivs i designmönster Ja Kompositmönster är ett designmönster, hänvisar till strukturella mönster, kombinerar ett objekt ... Wikipedia
Designmönster Tillstånd Typ: beteende Beskrivs i designmönster Ja Tillstånd är ett designmönster. Det används i de fall där, under programkörning, ett objekt ... Wikipedia
Innan du läser, vänligen granska följande konventioner och koncept. Den här artikeln uppdateras med viss frekvens, så om du har läst den tidigare är det inte ett faktum att uppgifterna inte har ändrats.
Adapter tillhör klassen strukturell mönster. Det används för att konvertera ett gränssnitt till ett annat som krävs av klienten. Adaptern säkerställer kompatibilitet för inkompatibla gränssnitt genom att implementera ett lager.
Funktionsprincip
Adaptern ärver målgränssnittet på ett öppet sätt (låt oss kalla det Mål), och ett slutet anpassningsbart gränssnitt ( Adaptee). Vid implementeringen av målgränssnittsmetoderna omdirigeras (delegeras) förfrågningar till en klass med ett anpassningsbart gränssnitt
Exempel
// Målgränssnitt, klienten kan bara arbeta med dets gränssnitt iTarget ( public function query(); ) // Anpassningsbart gränssnitt. Klienten vet inte hur man arbetar med det, men vill verkligen ha gränssnittet iAdaptee ( public function request(); ) // En klass som implementerar en anpassningsbar gränssnittsklass Adaptee implementerar iAdaptee ( public function request() ( return __CLASS__ . ":: " . __METHOD__; ) ) klass Adapter implementerar iTarget ( skyddad $adaptee = null; offentlig funktion __construct() ( $this -> adaptee = new Adaptee(); ) public function query() ( return $this -> adaptee -> request (); ) ) $ Target = new Adapter(); print $Target -> query(); // "Adaptee::request"Slutsats
En adapter kan anpassa flera gränssnitt till ett samtidigt, detta mönster kallas objektadapter Användningen av detta mönster är motiverat i flera fall. Om du vill använda en befintlig klass med ett annat gränssnitt. Om du ska använda det anpassningsbara gränssnittet på flera ställen, och inte har möjlighet att få det att se likadant ut överallt, så kan det vara en bra idé att använda utbytbara adaptrar.
Syftet med adaptermönstret
Ofta i nytt mjukvaruprojekt Det går inte att återanvända befintlig kod. Till exempel kan befintliga klasser ha önskad funktionalitet, men har inkompatibla gränssnitt. I sådana fall bör du använda adaptermönstret.
Adaptermönstret, som är ett mjukvaruomslag över befintliga klasser, omvandlar deras gränssnitt till en form som lämpar sig för efterföljande användning.
Låt oss titta på ett enkelt exempel på när adaptermönstret ska användas. Låt oss utveckla ett klimatkontrollsystem utformat för att automatiskt hålla omgivningstemperaturen inom specificerade gränser. En viktig komponent Ett sådant system är en temperatursensor, med vilken den omgivande temperaturen mäts för efterföljande analys. För denna sensor finns det redan en färdig programvara från tredjepartsutvecklare, vilket är en klass med lämpligt gränssnitt. Du kan dock inte använda denna klass direkt, eftersom sensoravläsningarna tas i grader Fahrenheit. Du behöver en adapter som omvandlar temperaturen till Celsius.
Kö-, priority_queue- och stackbehållarna i standard-STL-mallbiblioteket implementeras på basis av den sekventiella listan, deque- och vektorbehållaren, och anpassar deras gränssnitt till den önskade formen. Det är därför dessa behållare kallas adapterbehållare.
Beskrivning av adaptermönstret
Låt klassen vars gränssnitt behöver anpassas till önskad form få namnet Adaptee. För att lösa problemet med att transformera dess gränssnitt introducerar adaptermönstret följande klasshierarki:
- Mål virtuell basklass. Meddelas här användargränssnitt lämplig typ. Endast detta gränssnitt är tillgängligt för användaren.
- En härledd klass av Adapter som implementerar Target-gränssnittet. Den här klassen innehåller också en pekare eller referens till en Adaptee-instans. Adaptermönstret använder den här pekaren för att vidarebefordra klientsamtal till Adaptee. Eftersom Adaptee- och Target-gränssnitten är inkompatibla med varandra kräver dessa samtal vanligtvis konvertering.
Implementering av adaptermönstret
Klassisk implementering av adaptermönstret
Här är en implementering av adaptermönstret. För exemplet ovan anpassar vi avläsningarna för temperatursensorn i klimatkontrollsystemet och konverterar dem från grader Fahrenheit till grader Celsius (det antas att koden för denna sensor inte är tillgänglig för modifiering).
#omfatta
Implementering av adaptermönstret baserat på slutet arv
Låt vårt klimatkontrollsystems temperatursensor stödja justeringsfunktionen för mer exakta avläsningar. Denna funktion behöver inte användas, vilket förmodligen är anledningen till att motsvarande adjust()-metod förklaras skyddad av utvecklarna i den befintliga FahrenheitSensor-klassen.
Systemet vi utvecklar måste stödja mätanpassning. Eftersom åtkomst till en skyddad metod via en pekare eller länk är förbjuden är den klassiska implementeringen av adaptermönstret inte längre lämplig här. Den enda lösningen är att ärva från FahrenheitSensor-klassen. Gränssnittet för denna klass måste förbli otillgängligt för användaren, så arvet måste vara privat.
De mål som eftersträvas när man använder öppet och slutet arv är olika. Medan öppet arv används för gränssnitt och implementeringsarv, används stängt arv endast för implementeringsarv.
#omfatta
Resultat av applicering av adaptermönstret
Fördelar med adaptermönstret
- Adaptermönstret låter dig återanvända befintlig kod genom att anpassa dess inkompatibla gränssnitt till en användbar form.
Nackdelar med adaptermönstret
- Uppgiften att konvertera gränssnitt kan vara svår om klientanrop och/eller skickade parametrar inte har en funktionell överensstämmelse i objektet som anpassas.
Hej alla! Idag ska vi prata om Designmönster för mönsteradapter. Som namnet antyder tjänar det till att säkerställa att något anpassa, men vad? Och den här artikeln kommer att svara på den här frågan för dig.
Beskrivning av adapterns designmönster
Låt oss gå lite bort från programmering och titta på adaptrar I verkligheten. Till exempel har du köpt en del utrustning (till exempel en dator) utomlands. När du kom hem med den upptäckte du att kontakten av en annan standard inte passade i vårt ryska uttag. Vad ska man göra? Höger! Du måste gå till affären och köpa adapter, med hjälp av vilken du kan ansluta din dator till nätverket. Alltså den här adapter och där är adapter. Vi sätter in en främmande kontakt i den och ansluter själva adaptern till nätverket och allt fungerar utmärkt. De där. det tjänar helt enkelt lager mellan vårt uttag och främmande kontakt.
Så jag tror att du har förstått det vad är en adapter i livet. I programmering är det samma sak.
Exempel på adapterimplementering i PHP
gränssnitt iMain (public function send();
}
Interface iAdaptee (
offentlig funktionsutredning();
}
Klass Adaptee implementerar iAdaptee (
public function enquiry() (
returnera __KLASS__."::".__METHOD__;
}
}
Klassadapter implementerar iMain (
skyddad $adaptee = null;
Offentlig funktion __construct() (
$this->adaptee = new Adaptee();
}
Public function send() (
returnera $this->adaptee->inquiry();
}
}
$goal = new Adapter();
echo $goal->send(); // "Adaptee::förfrågan"
?>
Så här är vår kod. Låt oss ta reda på det. Vi har ett gränssnitt iMain, kan klientkoden fungera med den. Därefter har vi gränssnittet iAdaptee, som klientkoden inte kan fungera med, men vi måste på något sätt interagera med den. Sen har vi klass Adaptee iAdaptee och inuti den har en metod som kallas förfrågan, som helt enkelt returnerar en sträng som KLASS::METOD. Här kommer vi till klassen Adapter, som ärver gränssnittet iMain. Inuti den skapar vi en skyddad egendom anpassad, likvärdig null. Därefter skapar vi ett klassobjekt i konstruktorn Adaptee och skriv det till vår skyddade egendom. I metod skicka vi returnerar metodanropet förfrågan.
Det är allt. Nu skapar vi vårt adapterobjekt och anropar metoden skicka.
De där. hela poängen är att vi kan arbeta med ett gränssnitt, men inte med ett annat, och för att på något sätt interagera med detta gränssnitt som är otillgängligt för oss skapar vi adapter, ett lager genom vilket vi genomför vår uppgift.
Slutsats
Nu kan det tyckas för dig att allt är väldigt komplicerat och svårt, men det är inte så. Jag tror att du förstår innebörden av adaptern, men nu behöver du mer övning. Ta en titt på koden som ges i den här artikeln igen och försök förstå det. Gå igenom det rad för rad och recitera det som om du vore en tolk php. Jag råder dig också att titta på koden för något ramverk, eftersom den här mallen används där ganska ofta.
Detta avslutar denna ganska långa artikel, tack för din uppmärksamhet!