Apache Commons Chain

1. Einleitung

Apache Commons Chain ist eine Bibliothek, die das Chain of Responsibility-Muster verwendet - im Allgemeinen zum Organisieren komplexer Verarbeitungsabläufe, in denen mehrere Empfänger eine Anforderung verarbeiten können.

In diesem kurzen Artikel werden wir ein Beispiel durchgehen, das eine Abhebung von einem Geldautomaten darstellt.

2. Maven-Abhängigkeit

Zu Beginn importieren wir die neueste Version dieser Bibliothek mit Maven:

 commons-chain commons-chain 1.2  

Um nach der neuesten Version dieser Bibliothek zu suchen, klicken Sie hier.

3. Beispielkette

Der Geldautomat nimmt eine Nummer als Eingabe und gibt sie an Handler weiter, die für die Ausführung verschiedener Aktionen verantwortlich sind. Dazu gehört die Berechnung der Anzahl der auszugebenden Banknoten und das Senden einer Benachrichtigung an die Bank und den Kunden über die Transaktion.

4. Kettenkontext

Der Kontext stellt den aktuellen Status einer Anwendung dar und speichert Informationen zur Transaktion.

Für unsere Abhebungsanforderung an Geldautomaten benötigen wir folgende Informationen:

  • Gesamtbetrag, der abgehoben werden muss
  • Anzahl von 100 Nennwerten
  • Anzahl von 50 Nennwerten
  • Anzahl von 10 Nennwerten
  • Betrag, der noch abgezogen werden muss

Dieser Status wird in einer Klasse definiert:

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

5. Befehl

Der Befehl nimmt den C ontext als Eingabe und verarbeitet ihn.

Wir werden jeden der oben genannten Schritte als Befehl implementieren :

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

Der Befehl s für FiftyDenominationDispenser & TenDenominationDispenser sind ähnlich.

6. Kette

Eine Kette ist eine Sammlung von Befehlen, die in einer bestimmten Reihenfolge ausgeführt werden sollen. Unsere Kette wird die oben besteht Befehl s und auch einen AuditFilter am Ende:

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

Wenn ein Befehl in der Kette true zurückgibt, wird die Kette zum Beenden gezwungen.

7. Filter

Ein Filter ist ebenfalls ein Befehl, jedoch mit einer postProcess- Methode, die nach der Ausführung der Kette aufgerufen wird .

Unser Filter sendet eine Benachrichtigung an den Kunden und die Bank:

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. Kettenkatalog

Es ist eine Sammlung von Ketten und Befehlen mit ihren logischen Namen.

In unserem Fall enthält unser Katalog die AtmWithdrawalChain.

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

9. Verwenden der Kette

Mal sehen, wie wir die obige Kette verwenden können , um eine Auszahlungsanforderung zu bearbeiten. Wir erstellen zuerst einen Kontext und übergeben ihn dann an die Kette. Die Kette verarbeitet den Kontext.

Wir werden einen Testfall schreiben, um unsere AtmWithdrawalChain zu demonstrieren :

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. Schlussfolgerung

In diesem Tutorial haben wir ein praktisches Szenario mit der Apache Commons Chain-Bibliothek von Apache untersucht. Weitere Informationen hierzu finden Sie hier.

Und wie immer ist der Code für diesen Artikel auf Github verfügbar.