Apache Commons-Kette

Apache Commons Chain

1. Einführung

Apache Commons Chain ist eine Bibliothek, die die Verantwortungskettepattern 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

Zunächst importieren wir die neueste Version dieser Bibliothek mit Maven:


    commons-chain
    commons-chain
    1.2

So suchen Sie nach der neuesten Version dieser Bibliothek:go here.

3. Beispielkette

Der Geldautomat nimmt eine Nummer als Eingabe und gibt sie an die für die Ausführung verschiedener Aktionen verantwortlichen Bearbeiter weiter. Diese umfassen 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 abgehoben werden

  • Anzahl der 100 Stückelnoten

  • Anzahl der 50 Stückelnoten

  • Anzahl der 10 Stückelnoten

  • Noch abzuhebender Betrag

Dieser Zustand ist in einer Klasse definiert:

public class AtmRequestContext extends ContextBase {
    int totalAmountToBeWithdrawn;
    int noOfHundredsDispensed;
    int noOfFiftiesDispensed;
    int noOfTensDispensed;
    int amountLeftToBeWithdrawn;

    // standard setters & getters
}

5. Befehl

DasCommand nimmt dasContext als Eingabe und verarbeitet es.

Wir implementieren jeden der oben genannten Schritte alsCommand:

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

DieCommands fürFiftyDenominationDispenser &TenDenominationDispenser sind ähnlich.

6. Kette

AChain ist eine Sammlung von Befehlen, die in einer bestimmten Reihenfolge ausgeführt werden sollen. UnsereChain bestehen aus den oben genanntenCommands und auch einemAuditFilter am Ende:

public class AtmWithdrawalChain extends ChainBase {

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

WennCommand inChain true zurückgibt, wird das Ende vonChain erzwungen.

7. Filter

Ein Filter ist ebenfalls einCommand, jedoch mit einerpostProcess-Methode, die nach der Ausführung vonChain. aufgerufen wird

UnsereFilter senden 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 vonChains undCommands mit ihren logischen Namen.

In unserem Fall enthalten unsereCatalog dieAtmWithdrawalChain.

public class AtmCatalog extends CatalogBase {

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

9. Die Kette benutzen

Mal sehen, wie wir die oben genanntenChain verwenden können, um eine Auszahlungsanforderung zu verarbeiten. Wir erstellen zuerst einContext und übergeben dann dasChain.. DasChain verarbeitet dasContext.

Wir werden einen Testfall schreiben, um unsereAtmWithdrawalChain: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. Fazit

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

Und wie immer ist der Code für diesen Artikelover on Github verfügbar.