S nárůstem architektury orientované na služby (SOA) stále více organizací využívá pro své podnikové systémy služby třetích stran. Tyto společnosti musí držet krok s rychle se měnícím podnikatelským prostředím, což může znamenat opuštění služeb jednoho poskytovatele služeb za jiného.
V takových případech může být stávající architektura podniku nekompatibilní s architekturou nového poskytovatele. Místo plýtvání měsíců přepisováním podnikového kódu, aby byl kompatibilní s novým softwarem, může podnik použít návrhový vzor adaptéru.
Jaký je návrhový vzor adaptéru?
Vzor adaptéru umožňuje, aby třídy, které mají nekompatibilní rozhraní, spolupracovaly. Dělá to převodem rozhraní existující třídy (nebo softwaru) na rozhraní, které klient (nebo služba) očekává. Existují dva typy adaptérů: objektové adaptéry a adaptéry třídy.
Objektový adaptér používá kompozici k zabalení adaptéru do adaptéru a efektivně vytváří rozhraní, které klient očekává. Pokud tedy klient očekává řetězec, adaptér vezme celé číslo (adaptovaný) a dá mu vlastnosti řetězce.
Výše uvedený diagram tříd představuje objektový adaptér. The třída adaptéru implementuje cílové rozhraní, efektivně získat přístup ke všem metodám rozhraní. Poté se přizpůsobí adaptant a zabalí to adaptant s cílové rozhraní metody.
Adaptér třídy používá vícenásobnou dědičnost, kde třída adaptéru je podtřídou jak adaptovaného, tak cílové třídy. Níže uvedený diagram tříd představuje adaptér třídy, který můžete volně používat v programovacích jazycích, které podporují vícenásobnou dědičnost.
Implementace návrhového vzoru adaptéru v Javě
Tato aplikace bude implementovat objektový adaptér. Tato ukázková aplikace bude simulovat finanční organizaci přecházející z používání a zpracování charge karet na kreditní karty. Tato organizace původně používala následující rozhraní platební karty:
veřejnostrozhraníChargeCard{
veřejnostprázdnotaměsíční zůstatek();
veřejnostprázdnotapokuta za zpoždění();
veřejnostprázdnotaRoční poplatek();
}
Oblíbeným typem platební karty, kterou systém této organizace zpracovává, je švestková karta:
veřejnosttřídaPlumCardnářadíChargeCard{
soukroméint číslo karty;
soukromé Řetězec customerName;
soukromédvojnásobek Zůstatek;// primární konstruktor
veřejnostPlumCard(int cardNo, String customerName, dvojnásobek Zůstatek){
tento.cardNo = cardNo;
tento.customerName = customerName;
tento.bilance = rovnováha;
}
// getters a setters
veřejnostintgetCardNo(){
vrátit se číslo karty;
}
veřejnostprázdnotasetCardNo(int číslo karty){
tento.cardNo = cardNo;
}
veřejnost Tětiva getCustomerName(){
vrátit se Jméno zákazníka;
}
veřejnostprázdnotasetCustomerName(řetězec customerName){
tento.customerName = customerName;
}
veřejnostdvojnásobekgetBalance(){
vrátit se Zůstatek;
}
veřejnostprázdnotasetBalance(dvojnásobek Zůstatek){
tento.bilance = rovnováha;
}
@Přepsat
veřejnostprázdnotaměsíční zůstatek(){
System.out.println("V lednu " + tento.customerName + "utracený" + tento.Zůstatek);
}
@Přepsat
veřejnostprázdnotapokuta za zpoždění(){
System.out.println(tento.customerName + "měsíční poplatek z prodlení je 80,00 $");
}
@Přepsat
veřejnostprázdnotaRoční poplatek(){
System.out.println(tento.customerName + "roční poplatek je 200,00 $");
}
}
Tato finanční instituce přechází na kreditní karty a postupně vyřazuje platební karty, takže někteří z jejích zákazníků nyní mají kreditní karty:
veřejnostrozhraníKreditní karta{
veřejnostprázdnotaměsíčníMinPayment();
veřejnostprázdnotazájem();
veřejnostprázdnotaRoční poplatek();
}
Podnikový systém finančních institucí nyní zpracovává pouze kreditní karty, protože se v nadcházejícím roce chystá přestat používat charge karty. Většina jejich zákazníků ale stále používá charge karty. Inženýři se tedy rozhodli, že bude nejlepší implementovat adaptér, dokud všichni jejich zákazníci nepřejdou na kreditní kartu.
veřejnosttřídaChargeCardAdapternářadíKreditní karta{
ChargeCard chargeCard;veřejnostChargeCardAdapter(ChargeCard chargeCard){
tento.chargeCard = chargeCard;
}@Přepsat
veřejnostprázdnotaměsíčníMinPayment(){
tento.chargeCard.monthlyBalance();
}@Přepsat
veřejnostprázdnotazájem(){
tento.chargeCard.lateFee();
}
@Přepsat
veřejnostprázdnotaRoční poplatek(){
tento.chargeCard. Roční poplatek();
}
}
Tento adaptér ChargeCard třída Java implementuje kreditní kartu rozhraní Java. Přizpůsobuje ChargeCard (přizpůsobený) a dává jí vlastnosti kreditní karty. Systém například zpracuje úrokový poplatek kreditní karty, což je poplatek z prodlení u zákazníka s charge kartou, který ještě neprovedl konverzi.
Výhody použití vzoru adaptéru
Hlavní výhodou použití vzoru adaptéru je, že umožňuje klientům používat nové služby, knihovny a funkce, aniž by měnili svůj kód. To podporuje škálovatelnost aplikací.
Další výhodou je, že tento vzor je také pružný. Vzor adaptéru poskytuje dvě metody implementace: objektové adaptéry a adaptéry tříd.