Apache Commons Chain

1. Introduktion

Apache Commons Chain er et bibliotek, der bruger Chain of Responsibility-mønsteret - generelt bruges til at organisere komplekse behandlingsstrømme, hvor flere modtagere kan behandle en anmodning.

I denne hurtige artikel gennemgår vi et eksempel, der repræsenterer en tilbagetrækning fra en pengeautomat.

2. Maven-afhængighed

For at starte importerer vi den nyeste version af dette bibliotek ved hjælp af Maven:

 commons-chain commons-chain 1.2 

For at kontrollere den nyeste version af dette bibliotek - gå her.

3. Eksempel på kæde

Hæveautomaten tager et nummer som input og videregiver det til håndtere, der er ansvarlige for at udføre forskellige handlinger. Disse involverer beregning af antallet af pengesedler, der skal udleveres, og afsendelse af en meddelelse til banken og kunden om transaktionen.

4. Kædekontekst

Konteksten repræsenterer den aktuelle status for en applikation og lagrer oplysninger om transaktionen.

For vores anmodning om hævning af pengeautomat er de oplysninger, vi har brug for:

  • Samlet beløb, der skal trækkes tilbage
  • Antal 100 pålydende sedler
  • Antal 50 pålydende sedler
  • Antal 10 pålydende sedler
  • Beløb tilbage, der skal trækkes tilbage

Denne tilstand er defineret i en klasse:

offentlig klasse AtmRequestContext udvider ContextBase {int totalAmountToBeWithdrawn; int noFunHundredsDispensed; int noOfFiftiesDispensed; int noOfTensDispensed; int amountLeftToBeWithdrawn; // standard settere & getters}

5. Kommando

Det Kommando tager Context som et input og behandler det.

Vi implementerer hvert af de ovennævnte trin som en Kommando:

offentlig klasse HundredDenominationDispenser implementerer kommando {@Override offentlig boolsk udførelse (Kontekstkontekst) kaster undtagelse {intamountLeftToBeWithdrawn = (int) context.get ("amountLeftToBeWithdrawn); if (amountLeftToBeWithdrawn> = 100) {context.put (" noOft ); context.put ("amountLeftToBeWithdrawn", amountLeftToBeWithdrawn% 100);} returner false;}} 

Det Kommandos for FiftyDenominationDispenser & TenDenominationDispenser er ens.

6. Kæde

EN Kæde er en samling af kommandoer, der skal udføres i en specificeret rækkefølge. Vores Kæde vil bestå af ovenstående Kommandos og også en AuditFilter i slutningen:

offentlig klasse AtmWithdrawalChain udvider ChainBase {public AtmWithdrawalChain () {super (); addCommand (ny HundredDenominationDispenser ()); addCommand (ny FiftyDenominationDispenser ()); addCommand (ny TenDenominationDispenser ()); addCommand (nyt AuditFilter ()); }}

Når nogen Kommando i Kæde vender tilbage sandt, tvinger det Kæde at afslutte.

7. Filtrer

Et filter er også et Kommando men med en postProcess metode, der kaldes efter udførelsen af Kæde.

Vores Filter sender en meddelelse til kunden og banken:

offentlig klasse AuditFilter implementerer Filter {@Override public boolean postprocess (Context context, Exception exception) {// send notifikation til bank og bruger returnerer falsk; } @ Override offentlig boolsk udførelse (kontekstkontekst) kaster Undtagelse {returner falsk; }}

8. Kædekatalog

Det er en samling af Kæder og Kommandoer med deres logiske navne.

I vores tilfælde vores Katalog vil indeholde AtmWithdrawalChain.

offentlig klasse AtmCatalog udvider CatalogBase {public AtmCatalog () {super (); addCommand ("atmWithdrawalChain", ny AtmWithdrawalChain ()); }}

9. Brug af kæden

Lad os se, hvordan vi kan bruge ovenstående Kæde at behandle en anmodning om tilbagetrækning. Vi opretter først en Sammenhæng og send det derefter Kæde. Det Kæde vil behandle Sammenhæng.

Vi skriver en test case for at demonstrere vores PengeautomatWithdrawalChain:

offentlig klasse AtmChainTest {@Test offentlig ugyldighed givenInputsToContext_whenAppliedChain_thenExpectedContext () kaster Undtagelse {Context context = new AtmRequestContext (); context.put ("totalAmountToBeWithdrawn", 460); context.put ("amountLeftToBeWithdrawn", 460); Katalogkatalog = nyt AtmCatalog (); Kommando 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. Konklusion

I denne vejledning udforskede vi et praktisk scenario ved hjælp af Apache's Apache Commons Chain-bibliotek - som du kan læse mere om her.

Og som altid er koden til denne artikel tilgængelig på Github.


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