Reťazec Apache Commons
1. Úvod
Apache Commons Chain je knižnica, ktorá využíva model Chain of Responsibility - zvyčajne sa používa na organizáciu zložitých tokov spracovania, v ktorých môže žiadosť spracovať viac príjemcov.
V tomto rýchlom článku si ukážeme príklad predstavujúci výber z bankomatu.
2. Závislosť od Maven
Najskôr importujeme najnovšiu verziu tejto knižnice pomocou nástroja Maven:
spoločný reťazec spoločný reťazec 1.2
Najnovšiu verziu tejto knižnice nájdete tu.
3. Ukážka reťaze
ATM vezme číslo ako vstup a odovzdá ho obsluhujúcim pracovníkom zodpovedným za vykonávanie rôznych akcií. Zahŕňajú výpočet počtu bankoviek, ktoré sa majú vydať, a odoslanie oznámenia banke a zákazníkovi o transakcii.
4. Reťazový kontext
Kontext predstavuje aktuálny stav aplikácie, v ktorej sú uložené informácie o transakcii.
V prípade našej žiadosti o výber z bankomatu sú potrebné informácie:
- Celková suma, ktorá sa má vybrať
- Počet 100 nominálnych hodnôt
- Počet 50 poznámok k nominálnej hodnote
- Počet 10 poznámok k nominálnej hodnote
- Zostávajúca suma na výber
Tento stav je definovaný v triede:
verejná trieda AtmRequestContext rozširuje ContextBase {int totalAmountToBeWithdrawn; int noOfHundredsDispensed; int noOfFiftiesDispensed; int noOfTensDispensed; int sumaLeftToBeWithdrawn; // štandardní zakladatelia a obstarávatelia}
5. Príkaz
The Velenie berie C.ontext ako vstup a spracuje ho.
Každý z vyššie uvedených krokov implementujeme ako a Príkaz:
public class HundredDenominationDispenser implementuje príkaz {@Override public boolean execute (kontextový kontext) vyvolá výnimku {intamountLeftToBeWithdrawn = (int) context.get ("amountLeftToBeWithdrawn); if (amountLeftToBeWithdrawn> = 100) {context.put (" no ") ); context.put ("amountLeftToBeWithdrawn", amountLeftToBeWithdrawn% 100);} return false;}}
The Velenies pre FiftyDenominationDispenser & TenDenominationDispenser sú si podobné.
6. Reťaz
A Reťaz je skupina príkazov, ktoré sa majú vykonať v určenom poradí. Náš Reťaz bude pozostávať z vyššie uvedeného Velenies a tiež an AuditFilter nakoniec:
public class AtmWithdrawalChain rozširuje ChainBase {public AtmWithdrawalChain () {super (); addCommand (nový HundredDenominationDispenser ()); addCommand (nový FiftyDenominationDispenser ()); addCommand (nový TenDenominationDispenser ()); addCommand (nový AuditFilter ()); }}
Keď nejaké Velenie v Reťaz vráti true, vynúti Reťaz do konca.
7. Filtrovať
Filter je tiež a Velenie ale s a postproces metóda, ktorá sa volá po vykonaní Reťaz.
Náš Filtrovať pošle oznámenie zákazníkovi a banke:
public class AuditFilter implementuje Filter {@Override public boolean postprocess (Context context, Exception exception) {// odoslať upozornenie do banky a návrat používateľa false; } @Override public boolean execute (Context context) throws Exception {return false; }}
8. Katalóg reťazí
Je to zbierka Reťaze a Príkazy s ich logickými názvami.
V našom prípade náš Katalóg bude obsahovať AtmWithdrawalChain.
verejná trieda AtmCatalog rozširuje CatalogBase {public AtmCatalog () {super (); addCommand ("atmWithdrawalChain", nový AtmWithdrawalChain ()); }}
9. Používanie reťaze
Pozrime sa, ako môžeme vyššie uvedené využiť Reťaz na vybavenie žiadosti o výber. Najprv si vytvoríme a Kontext a potom odovzdať Reťaz. The Reťaz spracuje Kontext.
Napíšeme testovací prípad, ktorý bude demonštrovať náš AtmWithdrawalChain:
public class AtmChainTest {@Test public void givenInputsToContext_whenAppliedChain_thenExectedContext () vyvolá výnimku {Context context = new AtmRequestContext (); context.put ("totalAmountToBeWithdrawn", 460); context.put ("amountLeftToBeWithdrawn", 460); Katalógový katalóg = nový AtmCatalog (); Príkaz atmWithdrawalChain = catalog.getCommand ("atmWithdrawalChain"); atmWithdrawalChain.execute (kontext); assertEquals (460, (int) context.get ("totalAmountToBeWithdrawn")); assertEquals (0, (int) context.get ("amountLeftToBeWithdrawn")); assertEquals (4, (int) context.get ("noOfHundredsDispensed")); assertEquals (1, (int) context.get ("noOfFiftiesDispensed")); assertEquals (1, (int) context.get ("noOfTensDispensed")); }}
10. Záver
V tomto tutoriáli sme preskúmali praktický scenár využívajúci knižnicu Apache's Apache Commons Chain - o ktorej si môžete prečítať viac tu.
A ako vždy je kód tohto článku k dispozícii na stránkach Github.