Apache Commons-keten

1. Inleiding

Apache Commons Chain is een bibliotheek die het Chain of Responsibility-patroon gebruikt - over het algemeen gebruikt voor het organiseren van complexe verwerkingsstromen waarin meerdere ontvangers een verzoek kunnen verwerken.

In dit korte artikel bespreken we een voorbeeld van een opname aan een geldautomaat.

2. Maven Afhankelijkheid

Om te beginnen importeren we de nieuwste versie van deze bibliotheek met behulp van Maven:

 commons-chain commons-chain 1.2 

Ga hierheen om de meest recente versie van deze bibliotheek te controleren.

3. Voorbeeldketen

De geldautomaat neemt een nummer als invoer en geeft dit door aan handlers die verantwoordelijk zijn voor het uitvoeren van verschillende acties. Het gaat hierbij om het berekenen van het aantal af te geven bankbiljetten en het sturen van een melding naar de bank en de klant over de transactie.

4. Ketencontext

De context vertegenwoordigt de huidige status van een applicatie, waarin informatie over de transactie is opgeslagen.

Voor ons verzoek om geldopnames is de informatie die we nodig hebben:

  • Totaal op te nemen bedrag
  • Aantal 100 coupures
  • Aantal 50 coupures
  • Aantal van 10 coupures
  • Bedrag dat nog moet worden opgenomen

Deze toestand wordt gedefinieerd in een klasse:

openbare klasse AtmRequestContext breidt ContextBase uit {int totalAmountToBeWithdrawn; int noOfHundredsDispensed; int noOfFiftiesDispensed; int noOfTensDispensed; int amountLeftToBeWithdrawn; // standaard setters & getters}

5. Commando

De Opdracht neemt de Context als input en verwerkt deze.

We zullen elk van de bovenstaande stappen implementeren als een Opdracht:

public class HundredDenominationDispenser implementeert Commando {@Override public boolean execute (Context context) gooit uitzondering {intamountLeftToBeWithdrawn = (int) context.get ("amountLeftToBeWithdrawn); if (amountLeftToBeWithdrawn> = 100) {contextLeftToBeWithdrawn> = 100) {contextLeftToBeWithdrawn" 100Withdrawn ); context.put ("amountLeftToBeWithdrawn", amountLeftToBeWithdrawn% 100);} return false;}} 

De Opdrachts voor FiftyDenominationDispenser & TenDenominationDispenser Zijn hetzelfde.

6. Ketting

EEN Ketting is een verzameling opdrachten die in een bepaalde volgorde moeten worden uitgevoerd. Onze Ketting zal bestaan ​​uit het bovenstaande Opdrachts en ook een AuditFilter op het eind:

openbare klasse AtmWithdrawalChain breidt ChainBase uit {openbare AtmWithdrawalChain () {super (); addCommand (nieuwe HundredDenominationDispenser ()); addCommand (nieuwe FiftyDenominationDispenser ()); addCommand (nieuwe TenDenominationDispenser ()); addCommand (nieuwe AuditFilter ()); }}

Wanneer een Opdracht in de Ketting geeft true terug, het forceert de Ketting beëindigen.

7. Filter

Een filter is ook een Opdracht maar met een postProcess methode die wordt aangeroepen na de uitvoering van de Ketting.

Onze Filter stuurt een bericht naar de klant en de bank:

public class AuditFilter implementeert Filter {@Override public boolean postprocess (contextcontext, uitzondering uitzondering) {// stuur een melding naar de bank en de gebruiker retourneert false; } @Override public boolean execute (Context context) genereert Uitzondering {return false; }}

8. Kettingcatalogus

Het is een verzameling van Kettingen en Commando's met hun logische namen.

In ons geval onze Catalogus bevat de AtmWithdrawalChain.

openbare klasse AtmCatalog breidt CatalogBase uit {openbare AtmCatalog () {super (); addCommand ("atmWithdrawalChain", nieuwe AtmWithdrawalChain ()); }}

9. Gebruik van de ketting

Laten we eens kijken hoe we het bovenstaande kunnen gebruiken Ketting om een ​​opnameverzoek te verwerken. We maken eerst een Context en geef het dan de Ketting. De Ketting zal het Context.

We zullen een testcase schrijven om onze te demonstreren ATMWithdrawalChain:

openbare klasse AtmChainTest {@Test openbare leegte gegevenInputsToContext_whenAppliedChain_thenExpectedContext () gooit uitzondering {Context context = nieuwe AtmRequestContext (); context.put ("totalAmountToBeWithdrawn", 460); context.put ("amountLeftToBeWithdrawn", 460); Cataloguscatalogus = nieuwe AtmCatalog (); Commando atmWithdrawalChain = catalog.getCommand ("atmWithdrawalChain"); atmWithdrawalChain.execute (context); 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. Conclusie

In deze tutorial hebben we een praktisch scenario onderzocht met behulp van de Apache Commons Chain-bibliotheek van Apache - waarover u hier meer kunt lezen.

En, zoals altijd, is de code voor dit artikel beschikbaar op Github.