Schritt 3: Klasse zu Interface erstellen
Auf Basis des generierten Interfaces kann, z.B. in Eclipse, mit wenigen Mausklicks eine Klasse erstellt werden, die das Interface implementiert:

Es soll eine Klasse "AmpelSchaltung" erzeugt werden, sie soll public sein und alle im generierten Interface definierten Methoden einbinden:

Die Implementierung der fachlichen Logik findet jetzt kompett in der aus dem Interface erzeugten Klasse "AmpelSchaltung" statt:
publicclassAmpelSchaltungimplementsIAmpelSchaltung {
@Override
publicbooleanisIstRotAn() {
returnfalse;
}
@Override
publicbooleanisIstGelbAn() {
returnfalse;
}
@Override
publicvoiddoNeuerZustandRotAn() {
}
@Override
publicvoiddoNeuerZustandGelbAn() {
}
@Override
publicvoiddoNeuerZustandGruenAn() {
}
@Override
publicvoiddoTrace(String dtName, String version,intrules,intrule) {
}
}
Als Vorlage für die Programmierung dient der in den vorhergehenden Kapiteln generierte Java-Sourcecode.
Im ersten Schritt werden die generierten is- und do-Methoden angepasst, die notwendigen Variablen werden dazu auf Instanz-Ebene bereitgestellt. Um das Laufzeitverhalten analysieren zu können, werden in der Methode doTrace die Informationen einfach auf der Konsole ausgeben.
publicclassAmpelSchaltungimplementsIAmpelSchaltung {
privateAmpelampel;
privatebooleanrotNeu;
privatebooleangelbNeu;
privatebooleangruenNeu;
@Override
publicbooleanisIstRotAn() {
returnampel.isRot();
}
@Override
publicbooleanisIstGelbAn() {
returnampel.isGelb();
}
@Override
publicvoiddoNeuerZustandRotAn() {
rotNeu=true;
}
@Override
publicvoiddoNeuerZustandGelbAn() {
gelbNeu=true;
}
@Override
publicvoiddoNeuerZustandGruenAn() {
gruenNeu=true;
}
@Override
publicvoiddoTrace(String dtName, String version,intrules,intrule) {
System.out.println(dtName ", " version ", " rules ", " rule);
}
}
Abschließend muss noch die Methode schalten(Ampel) eingebunden werden, analog zu dem in den vorherigen Kapiteln generierten Java-Sourcecode.
In diesem Beispiel wird anstelle des IF-ELSE-Regelbaumes eine Instanz des gene{shy}rier{shy}ten Regel{shy}moduls "RAmpelSchaltung" verwendet und an dessen Methode "execute" mit **this** die Instanz von "AmpelSchaltung" übergeben:
publicclassAmpelSchaltungimplementsIAmpelSchaltung {
privateAmpelampel;
privatebooleanrotNeu;
privatebooleangelbNeu;
privatebooleangruenNeu;
privateRAmpelSchaltungregelModul=newRAmpelSchaltung();
publicvoidschalten(Ampel ampel) {
this.ampel= ampel;
rotNeu=false;
gelbNeu=false;
gruenNeu=false;
regelModul.execute(this);
ampel.set(rotNeu,gelbNeu,gruenNeu);
this.ampel= null;
}
@Override
publicbooleanisIstRotAn() {
returnampel.isRot();
}
@Override
publicbooleanisIstGelbAn() {
returnampel.isGelb();
}
@Override
publicvoiddoNeuerZustandRotAn() {
rotNeu=true;
}
@Override
publicvoiddoNeuerZustandGelbAn() {
gelbNeu=true;
}
@Override
publicvoiddoNeuerZustandGruenAn() {
gruenNeu=true;
}
@Override
publicvoiddoTrace(String dtName, String version,intrules,intrule) {
System.out.println(dtName ", " version ", " rules ", " rule);
}
}
Besonderheiten dieser Generierungsart:
-
Weder die Entscheidungstabelle, noch das generierte Interface, noch das generierte Regelmodul enthalten anwendungsspezifischen Sourcecode!
-
Maximale Entkopplung der Steuerlogik (d.h. Entscheidungstabelle) von einer konkreten Implementierung
-
Mehrere Java-Implementierungen derselben Logik (z.B. in unterschiedlichen Projekten) sind problemlos möglich, Basis für jede Implementierung ist immer das generierte Interface