Simple Command Framework – Einführung in die Architektur

Die Architektur des Simple Command Framework ist, wie der Name schon sagt, einfach. Teil des Frameworks sind vor allem Interfaces und einige Default-Implementierungen. Für alle Belange gibt es dedizierte Interfaces und teilweise abstrakte Klassen, die einige Standardfälle implementieren. Es ist möglich ein Parameterobjekt entlang einer Kette oder Prozess zu führen, welches das ParameterObject Interface implementieren sollte. Das ParameterObject Interface ist tatsächlich nur ein Markerinterface.

Das Framework folgt dem composite pattern. Es gibt ein zweites Basisinterface welches auch Command erweitert aber als ein Kontainer von Command-Objekten arbeitet. Es ist nun möglich Ketten von Command und CommandContainer-Objekten zu komponieren.

Grundsätzlich arbeitet das Framework in drei Modi:

  1. Im Strategy-Modus wird das Command-Object genutzt um Algorithmen zu kapseln und sie ggf. über Dependency Injection in die jeweilige Klasse konfigurierbar zu injezieren.
  2. Im Chain-Modus können Ketten von Command-Objekten aufgebaut werden. Dabei ist sowohl ein einfaches Command Pattern implementiert (ohne Rücksprung) und das Chain-Of-Responsibility Designpattern.
  3. Im Prozessmodus können synchrone Prozesse über eine XML-Notation konfiguriert werden.

Die DefaultChainCommand Implementierung verfügt über eine leere execute()-Methode und stellt zusätzlich eine Implementierung für das chain of responsibility Pattern zur Verfügung. Die executeAsChain()-Methode ruft die execute()-Methode auf. Wenn keine Exception geschmissen wird, dann ist der Rückgabewert true. True sagt aus, dass die Arbeit der Gesamtkette nicht beendet ist und das nächste Kettenglied aufgerufen werden soll. Wenn die execute()-Methode eine Exception wirft ist dieses ein Indikator, dass die Ausführung der gesamten Kette gestoppt werden sollte, weil die Bearbeitung erfolgreich abgeschlossen ist. In diesem Fall gibt die executeAsChain()-Methode false zurück.

Der DefaultCommandContainer besitzt Methoden um Command-Objekte in den Kontainer einzufügen. Dieses geschieht entweder über die „normale Ordnung“ oder über eine Priorität. Werden zwei Command-Objekte mit gleicher Priorität eingefügt, so wird das zuerst eingefügte auch zuerst ausgeführt. Da der CommandContainer das gleiche Verhalten besitzt wie ein einfacher Command kann man auch rekursiv weitere Kontainer in den vorhandenen Kontainer einfügen. Das ist das exakte Verhalten des Composite Pattern.

SimpleCommandFramework

Hier eine kurze Zusammenfassung aller Bestandteile des Frameworks

Command: Interface um einen Algorithmus einzuschließen. In diesem Framework ist alles ein Command.

ChainCommand: Interface für ein Command-Objekt, welche in dem zweiten Modus arbeitet: Chain of Responsitibility.

ProcessCommand: Interface für ein Command-Objekt, welches im dritten Modus arbeitet: Process Mode.

CommandContainer: Interface um Command-Objekte in einen Kontainer zu gruppieren. CommandContainer-Objekte haben das gleiche Verhalten wie Command Objekte. So ist es möglich sowohl normale Command Objekte als auch CommandContainer in solchen Kontainer zu komponieren.

ParameterObject: Marker Interface für ein Paramterobjekt. ParameterObject Objekte sind der „Klebstoff“ zwischen verschiedenen Command-Objekten. Durch dieses Konzept ist das ganze Framework Thread-Safe. Command Implentierungen sollten im Allgemeinen Reentrant implementiert werden.

GenericParameterObject: Interface für ein generisches Parameterobjekt, welches nur mit Key-Value Paaren arbeitet. Besser ist es eigene typsicherere Parameterobjekte zu erzeugen und sie mit get- und set-Operatoren auszustatten (Beankonventionen). Da das gesamte Framework mit generischen Typen arbeitet, kann jedes Command-Objekt mit einem eigenen Parameterobjekt erzeugt werden.

AbstractDefaultChainCommand: Eine Implementierung welche eine generische Methode anbietet und das chain-of-responsibility pattern implementiert. Es wird einfache executeAsChain() aufgerufen. Alle Command-Objekte der Kette werden ausgeführt. Wenn ein Command eine Exception wirft, wird die Ausführung der gesamten Kette gestoppt.

AbstractDefaultProcessCommand: Eine Implementierung welche eine generische Methode anbietet und den Prozessmode des Frameworks implementiert. Über den Aufruf von executeAsProcess()werden alle Commands so aufgerufen, wie es in der Prozessbeschreibung angegeben ist.

DefaultCommandContainer: Eine Implementierung um Command-Objekte in einem Kontainer zu gruppieren. Die Ausführung des Kontainers wird alle Bestandteile des Kontainers nacheinander aufrufen (entweder Commands oder auch Commandkontainer). Der DefaultCommandContainer implementiert alle drei Modi des Frameworks.

DefaultParameterObject: Eine Implementierung des GenericParameterObject Interfaces um mit generischen Datenstrukturen zu arbeiten. Dieses ist nicht empfohlen, weil dieses nicht typsicher ist.

ChainBuilder: Der Chainbilder ist ein Interface um Chains und Prozesse über verschiedene Quellformate, z.B. XML, Spring zu konfigurieren. Konkrete Klassen müssen dazu die buildChain() Methode implementieren.

InjectionChainBuilder: Chainbuilder welcher mit Hilfe einer Spring-Konfiguration oder einem anderen Dependency Injection Framework gefüttert wird um eine Kette zu konfigureieren.

XMLChainBuilder: Chainbuilder der mit Hilfe von XML konfiguriert wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert