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.


$config[zx-auto] not found$config[zx-overlay] not found