Schritt 3: Klasse zu Interface erstellen

Auf Basis des gene­rier­ten Interfaces kann, z.B. in Eclipse, mit wenigen Mausklicks eine Klasse erstellt werden, die das Interface implementiert:

image3333 45

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

image3333 46

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 gene­rier­ten 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 Gene­rie­rungs­art:

  • Weder die Ent­schei­dungs­ta­belle, noch das gene­rier­te Interface, noch das gene­rier­te Regel­modul enthalten anwendungsspezifischen Source­code!

  • Maximale Entkopplung der Steuerlogik (d.h. Ent­schei­dungs­ta­belle) von einer konkreten Implementierung

  • Mehrere Java-Implementierungen derselben Logik (z.B. in unter­schied­lichen Projekten) sind problemlos möglich, Basis für jede Implementierung ist immer das gene­rier­te Interface