Met de opkomst van servicegerichte architectuur (SOA) gebruiken steeds meer organisaties services van derden voor hun bedrijfssystemen. Deze bedrijven moeten gelijke tred houden met een snel veranderende zakelijke omgeving, wat kan betekenen dat ze de diensten van de ene dienstverlener moeten opgeven voor de andere.
In dergelijke gevallen kan de bestaande architectuur van een bedrijf onverenigbaar zijn met die van een nieuwe provider. In plaats van maanden te verspillen aan het herschrijven van bedrijfscode om deze compatibel te maken met nieuwe software, kan een bedrijf het adapterontwerppatroon gebruiken.
Wat is het adapterontwerppatroon?
Dankzij het adapterpatroon kunnen klassen met incompatibele interfaces samenwerken. Het doet dit door de interface van een bestaande klasse (of software) om te zetten in een interface die een klant (of service) verwacht. Er zijn twee typen adapters: objectadapters en klasse-adapters.
De objectadapter gebruikt compositie om de adapter in de adapter te wikkelen, waardoor effectief de interface wordt geproduceerd die de klant verwacht. Dus als de client een string verwacht, zal de adapter een geheel getal (de adaptee) nemen en het de kenmerken van een string geven.
Het bovenstaande klassendiagram vertegenwoordigt de objectadapter. De adapter klasse voert de doel-interface, effectief toegang krijgen tot alle methoden van de interface. Dan past het een aangepaste en wikkelt dat aangepaste met de doel-interface methoden.
De klasse-adapter maakt gebruik van meervoudige overerving, waarbij de adapterklasse de subklasse is van zowel de aangepaste als de doelklasse. Het onderstaande klassendiagram geeft de klasse-adapter weer, die u vrij kunt gebruiken in programmeertalen die meervoudige overerving ondersteunen.
Implementatie van het adapterontwerppatroon in Java
Deze applicatie implementeert de objectadapter. Deze voorbeeldtoepassing simuleert een financiële organisatie die overstapt van het gebruik en de verwerking van betaalkaarten naar creditcards. Deze organisatie gebruikte oorspronkelijk de volgende laadpasinterface:
openbaarkoppelHerlaadkaart{
openbaarleegtemaandelijksSaldo();
openbaarleegtelaatFee();
openbaarleegteJaarlijkse bijdrage();
}
Een populair type laadpas dat door het systeem van deze organisatie wordt verwerkt, is de pruimenkaart:
openbaarklasPlumCardimplementeertHerlaadkaart{
privaatint kaartnr;
privaat Tekenreeks klantnaam;
privaatdubbele evenwicht;// primaire constructeur
openbaarPlumCard(int cardNo, String klantnaam, dubbele evenwicht){
dit.kaartNr = kaartNr;
dit.customerName = klantnaam;
dit.balans = balans;
}
// getters en setters
openbaarintgetCardNo(){
opbrengst kaartnr;
}
openbaarleegtesetKaartnr(int kaartnr){
dit.kaartNr = kaartNr;
}
openbaar Snaar getKlantNaam(){
opbrengst klantnaam;
}
openbaarleegtesetKlantNaam(Tekenreeks klantnaam){
dit.customerName = klantnaam;
}
openbaardubbelekrijgBalance(){
opbrengst evenwicht;
}
openbaarleegtesetBalance(dubbele evenwicht){
dit.balans = balans;
}
@Overschrijven
openbaarleegtemaandelijksSaldo(){
Systeem.uit.println("In januari " + dit.klantNaam + " besteed " + dit.evenwicht);
}
@Overschrijven
openbaarleegtelaatFee(){
Systeem.uit.println(dit.klantNaam + "maandelijkse te late vergoeding is $ 80,00");
}
@Overschrijven
openbaarleegteJaarlijkse bijdrage(){
Systeem.uit.println(dit.klantNaam + " jaarlijkse vergoeding is $ 200,00 ");
}
}
Deze financiële instelling stapt over op creditcards en stopt met het uitfaseren van de betaalkaarten, dus sommige van hun klanten hebben nu creditcards:
openbaarkoppelKredietkaart{
openbaarleegtemaandelijksMinPayment();
openbaarleegteinteresse();
openbaarleegteJaarlijkse bijdrage();
}
Het bedrijfssysteem van de financiële instelling verwerkt nu alleen creditcards, omdat het het gebruik van betaalkaarten in het komende jaar wil stopzetten. Maar de meeste van hun klanten gebruiken nog steeds betaalkaarten. Dus besloten de ingenieurs dat het het beste was om een adapter te implementeren totdat al hun klanten waren overgestapt op een creditcard.
openbaarklasChargeCardAdapterimplementeertKredietkaart{
ChargeCard chargeCard;openbaarChargeCardAdapter(ChargeCard laadpas){
dit.chargeCard = chargeCard;
}@Overschrijven
openbaarleegtemaandelijksMinPayment(){
dit.chargeCard.maandelijksBalance();
}@Overschrijven
openbaarleegteinteresse(){
dit.chargeCard.lateFee();
}
@Overschrijven
openbaarleegteJaarlijkse bijdrage(){
dit.herlaadkaart. Jaarlijkse bijdrage();
}
}
Deze ChargeCardAdapter Java-klasse implementeert de Creditcard Java-interface. Het past ChargeCard (de adaptee) aan, waardoor het de kenmerken van een creditcard krijgt. Het systeem verwerkt bijvoorbeeld de rentevergoeding van een creditcard, wat de late vergoeding is van een klant met een laadpas die nog niet is omgezet.
Voordelen van het gebruik van het adapterpatroon
Het grote voordeel van het gebruik van het adapterpatroon is dat clients nieuwe services, bibliotheken en functies kunnen gebruiken zonder hun code te wijzigen. Dit bevordert de schaalbaarheid van applicaties.
Een ander voordeel is dat dit patroon ook flexibel is. Het adapterpatroon biedt twee implementatiemethoden: objectadapters en klasseadapters.