Mit dem Aufkommen serviceorientierter Architekturen (SOA) nutzen immer mehr Organisationen Dienste von Drittanbietern für ihre Unternehmenssysteme. Diese Unternehmen müssen mit einem sich schnell verändernden Geschäftsumfeld Schritt halten, was bedeuten kann, dass sie die Dienste eines Dienstleisters zugunsten eines anderen aufgeben.
In solchen Fällen ist die bestehende Architektur eines Unternehmens möglicherweise nicht mit der eines neuen Anbieters kompatibel. Anstatt Monate damit zu verschwenden, Unternehmenscode neu zu schreiben, um ihn mit neuer Software kompatibel zu machen, kann ein Unternehmen das Adapterdesignmuster verwenden.
Was ist das Adapterdesignmuster?
Das Adaptermuster ermöglicht die Zusammenarbeit von Klassen mit inkompatiblen Schnittstellen. Dazu wird die Schnittstelle einer vorhandenen Klasse (oder Software) in eine umgewandelt, die ein Client (oder Dienst) erwartet. Es gibt zwei Arten von Adaptern: Objektadapter und Klassenadapter.
Der Objektadapter verwendet eine Zusammensetzung, um den Adaptee mit dem Adapter zu verpacken, wodurch effektiv die Schnittstelle erzeugt wird, die der Client erwartet. Wenn also der Client einen String erwartet, nimmt der Adapter eine Ganzzahl (den Adaptee) und gibt ihr die Eigenschaften eines Strings.
Das obige Klassendiagramm repräsentiert den Objektadapter. Der Klasse Adapter implementiert die Zielschnittstelle, um effektiv Zugriff auf alle Methoden der Schnittstelle zu erhalten. Dann passt es sich an Angepasster und wickelt das ein Angepasster mit dem Zielschnittstelle Methoden.
Der Klassenadapter verwendet Mehrfachvererbung, wobei die Adapterklasse die Unterklasse sowohl der Adaptee- als auch der Zielklasse ist. Das folgende Klassendiagramm stellt den Klassenadapter dar, den Sie in Programmiersprachen verwenden können, die Mehrfachvererbung unterstützen.
Implementieren des Adapter-Entwurfsmusters in Java
Diese Anwendung implementiert den Objektadapter. Diese Beispielanwendung simuliert eine Finanzorganisation, die von der Verwendung und Verarbeitung von Charge Cards zu Kreditkarten übergeht. Diese Organisation verwendete ursprünglich die folgende Ladekartenschnittstelle:
öffentlichSchnittstelleChargeCard{
öffentlichLeereMonatssaldo();
öffentlichLeereVerspätungsgebühr();
öffentlichLeereJahresgebühr();
}
Eine beliebte Art von Abbuchungskarte, die das System dieser Organisation verarbeitet, ist die Pflaumenkarte:
öffentlichKlassePflaumenCardimplementiertChargeCard{
Privatgeländeint Karten-Nr;
Privatgelände Zeichenfolge Kundenname;
Privatgeländedoppelt Gleichgewicht;// primärer Konstruktor
öffentlichPflaumenCard(int cardNo, Zeichenfolge Kundenname, doppelt Gleichgewicht){
Das.cardNo = kartenNr;
Das.Kundenname = Kundenname;
Das.balance = Saldo;
}
// Getter und Setter
öffentlichintgetCardNr(){
zurückkehren Karten-Nr;
}
öffentlichLeeresetKartenNr(int Karten-Nr){
Das.cardNo = kartenNr;
}
öffentlich Schnur getCustomerName(){
zurückkehren Kundenname;
}
öffentlichLeeresetCustomerName(Zeichenfolge Kundenname){
Das.Kundenname = Kundenname;
}
öffentlichdoppelterhaltenBalance(){
zurückkehren Gleichgewicht;
}
öffentlichLeeresetBalance(doppelt Gleichgewicht){
Das.balance = Saldo;
}
@Überschreiben
öffentlichLeereMonatssaldo(){
System.out.println("Im Januar " + Das.Kundenname + " ausgegeben " + Das.Gleichgewicht);
}
@Überschreiben
öffentlichLeereVerspätungsgebühr(){
System.out.println(Das.Kundenname + "Die monatliche Verspätungsgebühr beträgt 80,00 $");
}
@Überschreiben
öffentlichLeereJahresgebühr(){
System.out.println(Das.Kundenname + "Jahresgebühr beträgt 200,00 $");
}
}
Dieses Finanzinstitut stellt auf Kreditkarten um und stellt die Abbuchungskarten aus, sodass einige ihrer Kunden jetzt Kreditkarten haben:
öffentlichSchnittstelleKreditkarte{
öffentlichLeeremonatlichMinZahlung();
öffentlichLeereInteresse();
öffentlichLeereJahresgebühr();
}
Das Unternehmenssystem der Finanzinstitute verarbeitet jetzt nur noch Kreditkarten, da es beabsichtigt, die Verwendung von Abbuchungskarten im kommenden Jahr einzustellen. Aber die meisten ihrer Kunden verwenden immer noch Ladekarten. Daher entschieden die Ingenieure, dass es am besten sei, einen Adapter zu implementieren, bis alle ihre Kunden auf eine Kreditkarte umgestellt hätten.
öffentlichKlasseChargeCardAdapterimplementiertKreditkarte{
ChargeCard ChargeCard;öffentlichChargeCardAdapter(ChargeCard chargeCard){
Das.chargeCard = chargeCard;
}@Überschreiben
öffentlichLeeremonatlichMinZahlung(){
Das.chargeCard.monthlyBalance();
}@Überschreiben
öffentlichLeereInteresse(){
Das.chargeCard.lateFee();
}
@Überschreiben
öffentlichLeereJahresgebühr(){
Das.chargeCard. Jahresgebühr();
}
}
Dieser ChargeCardAdapter Java-Klasse implementiert die Kreditkarte Java-Schnittstelle. Es adaptiert ChargeCard (das Angepasste) und verleiht ihr die Eigenschaften einer Kreditkarte. Beispielsweise verarbeitet das System die Zinsgebühr einer Kreditkarte, bei der es sich um die Verzugsgebühr eines noch nicht umgewandelten Charge-Karten-Kunden handelt.
Vorteile der Verwendung des Adaptermusters
Der Hauptvorteil der Verwendung des Adaptermusters besteht darin, dass Clients neue Dienste, Bibliotheken und Funktionen verwenden können, ohne ihren Code zu ändern. Dies fördert die Skalierbarkeit der Anwendung.
Ein weiterer Vorteil ist, dass dieses Muster auch flexibel ist. Das Adaptermuster stellt zwei Implementierungsmethoden bereit: Objektadapter und Klassenadapter.