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.