title image


Smiley mal ausführlich
Ok, machen wir mal weiter. Alle Objekte in der Klasse Automat unterzubringen ist ne gute Idee. Schlechter hingegen ist dort auch die Logik unterzubringen. Warum nicht noch ne Klasse Verwaltung?

Das Ziel von OOD ist es ja die Realität abzubilden. Gehen wir zur Realität über:



Ein Automat enthält eine Tastatur. Was macht sie? Lediglich ein Signal senden wenn eine Taste gedrückt wurde. An wen sie dieses Signal schickt weiss sie nicht. Meist wird die Tastatur aus einer Elektronik bestehen, die es ermöglicht über einen Stecker an die Signale zu kommen.



Weiterhin enthält der Automat eine Verwaltung, auch in Form einer Elektronik. Es wird einen Stecker geben, der beim Eingang eines Signals die Logik der Verwaltung in gang setzt und entsprechend reagiert. Wiess die Verwaltung von der Tastatur? Nein, das Einzige was Tastatur und Verwaltung gemeinsam haben ist die Verbindung die zwischen ihnen besteht, das Interface. Die Ingenieure beider Abteilungen haben sich garantiert vor der Entwicklung von Verwaltung/Tastatur auf ein gemeinsames Interface geeinigt.



Um es zu Verdeutlichen mal 'n anderes Beispiel. Ein Springbrunnen arbeitet wenn ihm Strom zugeführt wird. Dies kann mit einem Kippschalter oder mit einer Zeitschaltuhr geschehen. Wer kennt wen? Keiner! Der Springbrunnen weiss nicht von wem und wann er Strom erhält. Der Schalter, so wie auch die Uhr, wissen nicht wem sie Strom bereit stellen. Die einzige Verbindung besteht über die Leitung, das Interface.



Zurück zum Automaten. Die Verwaltung weiss also gar nicht ob das Signal von einer Tastatur kommt oder von einem anderen Mechanismus.

Es muss ein Interface her welches die Kopplung von Tastatur und Verwaltung ermöglicht. Jetzt mal 'n bisschen Quellcode. Das Interface zwichen Tastatur und Verwaltung:





public interface Benutzereingabe {

public static final int WUNSCH_COLA = 1;

public static final int WUNSCH_WASSER = 2;

void benutzerAktion(int typ);

}





Das ist die Einzige Methode die Tastatur und Verwaltung kennen müssen. Der Typ gibt an welche Taste gedrückt wurd (Cola oder Wasser).



Nun müssen natürlich die Klassen Verwaltung und Tastatur über dieses Interface verbunden werden. Zunächst die Klasse Verwaltung, sie muss dieses Interface implementieren:





public class Verwaltung implements Benutzereingabe {

// Die Implementierung

void benutzerAktion(int typ) {

// Hier die entsprechende Aktion ausführen

switch(typ) {

case Benutzereingabe.WUNSCH_COLA:

ausgabeWasser();

break;

case Benutzereingabe.WUNSCH_WASSER:

ausgabeCola();

break;

default:

fehler();

}

}

}





Nun die Klasse Tastatur. Signale werden in eine Richtung gesendet, die Tastatur senden ein Signal an ein Objekt welches das Interface Benutzereingabe implementiert.





public class Tastatur {

// Enthält das Objekt an das die Eingabe gesendet wird

private Benutzereingabe bearbeiter = null;

// Im Prinzip das Einstecken der elektronischen Verbindung

setBearbeiter(Benutzereingabe bearbeiter) {

this.bearbeiter = bearbeiter;

}

// Diese Methode wird aufgerufen wenn 'Cola' gedrückt wurde

protected void tasteCola() {

// Testen ob ein Bearbeiter angemeldet ist

if(bearbeiter != null) {

// Hier die Aktion durchfühern

bearbeiter.benutzerAktion(Benutzereingabe.WUNSCH_COLA);

}

}

// Diese Methode wird aufgerufen wenn 'Wasser' gedrückt wurde

protected void tasteWasser() {

// Testen ob ein Bearbeiter angemeldet ist

if(bearbeiter != null) {

// Hier die Aktion durchfühern

bearbeiter.benutzerAktion(Benutzereingabe.WUNSCH_WASSER);

}

}

// Diese Methode aktiviert die Tasteneingabe, wird später noch ersichtlich

public void run() {

// Cola gedrückt

tasteCola();

// Wasser gedrückt

tasteWasser();

}

}





Eigentlich ziemlich übersichtlich, oder? Nun das 'Zusammenstecken' des Automaten.





public class Automat {

// Variablen für die Instanzen

private Verwaltung verwaltung = null;

private Tastatur tastatur = null;

// Konstruktor

public Automat() {

// Instanzen erzeugen

verwaltung = new Verwaltung();

tastatur = new Tastatur();

// Das Einstecken, Verbindung über das Interface

tastatur.setBearbeiter(verwaltung);

// Den Automaten arbeiten lassen, wird Ausgeführt damit

// das Programm sich nicht sofort beendet!

tastatur.run();

}

// Der Einstiegspunkt

public static void main(String[] args) {

Automat automat = new Automat();

}

}





Du wirst jetzt eventuell denken durch tastatur.setBearbeiter(verwaltung); wird der Tastatur ja doch die Verwaltung bekannt. Dem ist nicht so, es wird lediglich das Interface Benutzereingabe erwartet. Tastatur ist es unmöglich andere Methoden aus Verwaltung aufzurufen! Wenn Du Dir den Code mal genau ansiehst wird Dir eventuell etwas auffallen. Wir haben einen Eventmechanismus erstellt. Zwar nicht so flexibel wie die Jave-Event-Implementierung, aber immerhin.



Ich hoffe es kann Dich etwas weiter bringen.



Ciao


Wenn man eine Entwicklung in der Informatik verstanden hat, ist sie bereits veraltet!

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: