Apache Commons Chain

1. Introduksjon

Apache Commons Chain er et bibliotek som bruker Chain of Responsibility-mønsteret - vanligvis brukt til å organisere komplekse prosesseringsstrømmer der flere mottakere kan behandle en forespørsel.

I denne raske artikkelen vil vi gå gjennom et eksempel som representerer et uttak fra en minibank.

2. Maven avhengighet

For å starte, importerer vi den nyeste versjonen av dette biblioteket ved hjelp av Maven:

 commons-chain commons-chain 1.2 

For å se etter den nyeste versjonen av dette biblioteket - gå hit.

3. Eksempelkjede

Minibanken tar et nummer som inngang og sender det til håndtere som er ansvarlige for å utføre forskjellige handlinger. Disse involverer å beregne antall sedler som skal utleveres, og sende et varsel til banken og kunden om transaksjonen.

4. Kjedekontekst

Konteksten representerer den gjeldende tilstanden til en applikasjon, og lagrer informasjon om transaksjonen.

For vår forespørsel om uttak av minibank er informasjonen vi trenger:

  • Totalt beløp som skal trekkes ut
  • Antall 100 sedler
  • Antall 50 sedler
  • Antall 10 pålydende sedler
  • Beløpet som skal trekkes tilbake

Denne tilstanden er definert i en klasse:

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

5. Kommando

De Kommando tar Context som et innspill og behandler det.

Vi implementerer hvert av trinnene nevnt ovenfor som en Kommando:

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

De Kommandos for FiftyDenominationDispenser & TenDenominationDispenser er like.

6. Kjede

EN Kjede er en samling kommandoer som skal utføres i en spesifisert rekkefølge. Våre Kjede vil bestå av ovennevnte Kommandos og også en AuditFilter på slutten:

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

Når noen Kommando i Kjede returnerer sant, tvinger det Kjede å ende.

7. Filtrer

Et filter er også et Kommando men med en postProcess metoden som kalles etter utførelsen av Kjede.

Våre Filter vil sende et varsel til kunden og banken:

offentlig klasse AuditFilter implementerer Filter {@Override offentlig boolsk etterprosess (kontekstkontekst, unntak unntak) {// send varsel til bank og bruker returnerer falsk; } @ Override offentlig boolsk utførelse (Kontekstkontekst) kaster Unntak {returner falsk; }}

8. Kjedekatalog

Det er en samling av Kjeder og Kommandoer med sine logiske navn.

I vårt tilfelle vår Katalog vil inneholde AtmWithdrawalChain.

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

9. Bruke kjeden

La oss se hvordan vi kan bruke ovennevnte Kjede å behandle en uttaksforespørsel. Vi oppretter først en Kontekst og send den deretter Kjede. De Kjede vil behandle Kontekst.

Vi skriver en prøvesak for å demonstrere vår MinibankWithdrawalChain:

offentlig klasse AtmChainTest {@Test offentlig ugyldighet givenInputsToContext_whenAppliedChain_thenExpectedContext () kaster Unntak {Context context = new AtmRequestContext (); context.put ("totalAmountToBeWithdrawn", 460); context.put ("amountLeftToBeWithdrawn", 460); Katalogkatalog = ny 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. Konklusjon

I denne opplæringen utforsket vi et praktisk scenario ved hjelp av Apache's Apache Commons Chain-bibliotek - som du kan lese mer om her.

Og som alltid er koden for denne artikkelen tilgjengelig på Github.