Apache Commons Chain

Apache Commons Chain

1. introduction

Apache Commons Chain est une bibliothèque qui utilise la chaîne de responsabilitépattern - généralement utilisée 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 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 -go here.

3. Exemple de chaîne

Le guichet automatique prend un numéro en entrée et le transmet aux gestionnaires responsables de l'exécution de différentes actions. Il s’agit de calculer le nombre de billets de banque à distribuer et d’envoyer 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 les suivantes:

  • Montant total à retirer

  • Nombre de 100 coupures

  • Nombre de notes de valeur nominale 50

  • Nombre de 10 notes de valeur

  • 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. Commander

LeCommand prend leContext comme entrée et le traite.

Nous mettrons en œuvre chacune des étapes mentionnées ci-dessus en tant queCommand:

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;
    }
}

LesCommands pourFiftyDenominationDispenser etTenDenominationDispenser sont similaires.

6. Chaîne

UnChain est une collection de commandes à exécuter dans un ordre spécifié. NosChain seront constitués desCommands ci-dessus et aussi d'unAuditFilter à la fin:

public class AtmWithdrawalChain extends ChainBase {

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

Quand unCommand dans leChain renvoie vrai, cela force la fin desChain.

7. Filtre

Un filtre est aussi unCommand mais avec une méthodepostProcess qui est appelée après l'exécution desChain.

NosFilter enverront 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 deChains etCommands avec leurs noms logiques.

Dans notre cas, nosCatalog contiendront lesAtmWithdrawalChain.

public class AtmCatalog extends CatalogBase {

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

9. Utilisation de la chaîne

Voyons comment nous pouvons utiliser lesChainci-dessus pour traiter une demande de retrait. Nous allons d'abord créer unContext, puis lui passer leChain. LeChain traitera lesContext.

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

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 - que vous pouvez en savoir plus surhere.

Et, comme toujours, le code de cet article est disponibleover on Github.