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.