Apache Commons Chain

1. Uvod

Apache Commons Chain je knjižnica koja koristi obrazac Lanac odgovornosti - koji se obično koristi za organiziranje složenih tokova obrade u kojem više primatelja može obraditi zahtjev.

U ovom ćemo kratkom članku proći kroz primjer koji predstavlja povlačenje novca s bankomata.

2. Ovisnost Mavena

Za početak ćemo uvesti najnoviju verziju ove knjižnice pomoću Mavena:

 zajednički lanac zajednički lanac 1.2 

Idite ovdje da biste provjerili ima li najnovije verzije ove knjižnice.

3. Primjer lanca

Bankomat uzima broj kao ulaz i prosljeđuje ga voditeljima koji su odgovorni za izvođenje različitih radnji. Oni uključuju izračunavanje broja novčanica koje se izdaju i slanje obavijesti banci i kupcu o transakciji.

4. Lančani kontekst

Kontekst predstavlja trenutno stanje aplikacije koja pohranjuje informacije o transakciji.

Za naš zahtjev za povlačenje bankomata podaci koji su nam potrebni su:

  • Ukupan iznos za podizanje
  • Broj 100 apoena
  • Broj apoena od 50 apoena
  • Broj 10 apoena
  • Preostali iznos za povlačenje

Ovo je stanje definirano u klasi:

javna klasa AtmRequestContext proširuje ContextBase {int totalAmountToBeWithdrawn; int noOfHundredsDispensed; int noOfFiftiesDispensed; int noOfTensDispensed; int iznosLeftToBeWithdrawn; // standardni postavljači i dobivači}

5. Zapovjedništvo

The Naredba uzima Context kao input i obrađuje ga.

Svaki od gore spomenutih koraka provest ćemo kao a Naredba:

javna klasa HundredDenominationDispenser implementira naredbu {@Override javno logičko izvršenje (kontekst konteksta) baca izuzetak {intamountLeftToBeWithdrawn = (int) context.get ("amountLeftToBeWithdrawn); if (amountLeftToBeWithdrawn> = 100) {contextBetaFoodDeftDoftDeftDoftDeftDoftDeftDoftDeftDoftDetaft ); context.put ("amountLeftToBeWithdrawn", amountLeftToBeWithdrawn% 100);} return false;}} 

The Naredbas za FiftyDenominationDispenser & TenDenominationDispenser su slični.

6. Lanac

A Lanac je zbirka naredbi koje se izvršavaju navedenim redoslijedom. Naše Lanac sastojat će se od gore navedenog Naredbas i također an AuditFilter na kraju:

javna klasa AtmWithdrawalChain proširuje ChainBase {public AtmWithdrawalChain () {super (); addCommand (novi HundredDenominationDispenser ()); addCommand (novi FiftyDenominationDispenser ()); addCommand (novi TenDenominationDispenser ()); addCommand (novi AuditFilter ()); }}

Kad ih ima Naredba u Lanac vraća true, prisiljava Lanac do kraja.

7. Filtar

Filtar je također a Naredba ali s a postProcess metoda koja se poziva nakon izvršavanja Lanac.

Naše filtar će poslati obavijest kupcu i banci:

javna klasa AuditFilter implementira Filter {@Override javni logički postproces (kontekst konteksta, iznimka iznimke) {// pošalji obavijest banci i korisnik vrati false; } @Override javno logičko izvršavanje (kontekst konteksta) baca iznimku {return false; }}

8. Katalog lanaca

To je zbirka Lanci i Naredbe s njihovim logičnim imenima.

U našem slučaju, naš Katalog sadržavat će AtmWithdrawalChain.

javna klasa AtmCatalog proširuje CatalogBase {public AtmCatalog () {super (); addCommand ("atmWithdrawalChain", novi AtmWithdrawalChain ()); }}

9. Korištenje lanca

Pogledajmo kako možemo koristiti gore navedeno Lanac za obradu zahtjeva za povlačenje. Prvo ćemo stvoriti Kontekst a zatim ga proslijedite Lanac. The Lanac će obraditi Kontekst.

Napisat ćemo testni slučaj da bismo demonstrirali svoje AtmWithdrawalChain:

javna klasa AtmChainTest {@Test javna praznina givenInputsToContext_whenAppliedChain_thenExpectedContext () baca iznimku {Context context = new AtmRequestContext (); context.put ("totalAmountToBeWithdrawn", 460); context.put ("amountLeftToBeWithdrawn", 460); Kataloški katalog = novi AtmCatalog (); Naredba atmWithdrawalChain = catalog.getCommand ("atmWithdrawalChain"); atmWithdrawalChain.execute (kontekst); 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. Zaključak

U ovom uputstvu istražili smo praktični scenarij koristeći Apacheovu knjižnicu Apache Commons Chain - o čemu više možete pročitati ovdje.

Kao i uvijek, kôd za ovaj članak dostupan je na Githubu.