Chaîne Apache Commons

1. Introduction

Apache Commons Chain est une bibliothèque qui utilise le modèle Chain of Responsibility - généralement utilisé pour organiser des flux de traitement complexes dans lesquels plusieurs destinataires peuvent traiter une demande.

Dans cet article rapide, nous allons passer en revue un exemple représentant un retrait à un guichet automatique.

2. Dépendance de Maven

Pour commencer, nous allons importer la dernière version de cette bibliothèque à l'aide de Maven:

 commons-chain commons-chain 1.2  

Pour vérifier la version la plus récente de cette bibliothèque - allez ici.

3. Exemple de chaîne

L'ATM prend un nombre en entrée et le transmet aux gestionnaires chargés d'effectuer différentes actions. Celles-ci impliquent le calcul du nombre de billets de banque à distribuer et l'envoi d'une notification à la banque et au client concernant la transaction.

4. Contexte de la chaîne

Le contexte représente l'état actuel d'une application, stockant des informations sur la transaction.

Pour notre demande de retrait au guichet automatique, les informations dont nous avons besoin sont:

  • Montant total à retirer
  • Nombre de 100 billets de dénomination
  • Nombre de 50 billets de dénomination
  • Nombre de 10 billets de dénomination
  • Montant restant à retirer

Cet état est défini dans une classe:

public class AtmRequestContext extends ContextBase { int totalAmountToBeWithdrawn; int noOfHundredsDispensed; int noOfFiftiesDispensed; int noOfTensDispensed; int amountLeftToBeWithdrawn; // standard setters & getters }

5. Commande

La commande prend le texte en C comme entrée et le traite.

Nous implémenterons chacune des étapes mentionnées ci-dessus en tant que commande:

public class HundredDenominationDispenser implements Command { @Override public boolean execute(Context context) throws Exception { intamountLeftToBeWithdrawn = (int) context.get("amountLeftToBeWithdrawn); if (amountLeftToBeWithdrawn >= 100) { context.put("noOfHundredsDispensed", amountLeftToBeWithdrawn / 100); context.put("amountLeftToBeWithdrawn", amountLeftToBeWithdrawn % 100); } return false; } } 

Les commandes pour FiftyDenominationDispenser et TenDenominationDispenser sont similaires.

6. Chaîne

Une chaîne est une collection de commandes à exécuter dans un ordre spécifié. Notre chaîne comprendra les commandes ci-dessus et également un filtre d' audit à la fin:

public class AtmWithdrawalChain extends ChainBase { public AtmWithdrawalChain() { super(); addCommand(new HundredDenominationDispenser()); addCommand(new FiftyDenominationDispenser()); addCommand(new TenDenominationDispenser()); addCommand(new AuditFilter()); } }

Lorsqu'une commande de la chaîne retourne true, elle force la fin de la chaîne .

7. Filtre

Un filtre est également une commande mais avec une méthode postProcess qui est appelée après l'exécution de la chaîne.

Notre filtre enverra une notification au client et à la banque:

public class AuditFilter implements Filter { @Override public boolean postprocess(Context context, Exception exception) { // send notification to bank and user return false; } @Override public boolean execute(Context context) throws Exception { return false; } }

8. Catalogue de chaînes

C'est une collection de chaînes et de commandes avec leurs noms logiques.

Dans notre cas, notre catalogue contiendra l' AtmWithdrawalChain.

public class AtmCatalog extends CatalogBase { public AtmCatalog() { super(); addCommand("atmWithdrawalChain", new AtmWithdrawalChain()); } }

9. Utilisation de la chaîne

Voyons comment nous pouvons utiliser la chaîne ci-dessus pour traiter une demande de retrait. Nous allons d'abord créer un contexte , puis lui passer la chaîne. La chaîne traitera le contexte.

Nous allons écrire un cas de test pour démontrer notre AtmWithdrawalChain:

public class AtmChainTest { @Test public void givenInputsToContext_whenAppliedChain_thenExpectedContext() throws Exception { Context context = new AtmRequestContext(); context.put("totalAmountToBeWithdrawn", 460); context.put("amountLeftToBeWithdrawn", 460); Catalog catalog = new AtmCatalog(); Command 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. Conclusion

Dans ce didacticiel, nous avons exploré un scénario pratique utilisant la bibliothèque Apache Commons Chain d'Apache - dont vous pouvez en savoir plus ici.

Et, comme toujours, le code de cet article est disponible à l'adresse over sur Github.