Beispiel für Interfaces - Beobachter am Fluss
Ein schönes Beispiel für die Nutzung von Interfaces und Klassenbeziehungen ist das kleine Programm “Beobachter am Fluss”.
Zutaten:
- Ein Fluss (Die Ruhr)
- Ein Beobachter der auf Wasserbüffel aufpasst
- Ein Beobachter der einen Wanderweg im Auge behält
- Ein Beobachter der auf eine Strasse über den Fluss acht gibt
Aktionen:
- Der Fluß verändert per Zufallssteuerung seinen Pegelstand zwischen 0 und 10 Metern
- Beobachter 1 muss bei 0,3 m seine Wasserbüffel tränken, sie bei 5 bis 7 m in den Stall bringen und über 7m bringt er sie weg vom Fluss
- Beobachter 2 meldet bei <= 1m dass der Fluss durchwatet werden kann und bei >=6m, dass der Wanderweg überschwemmt ist
- beobachter 3 sperrt bei >=9 m die Straße und ist ein typischer Beamter (Er ist nur für das Sperren zuständig)
Das .jar File könnt Ihr hier herunterladen http://www.joachim-uhl.de/dateien/BeobachteramFluss.jar (mit “java -jar BeobachteramFlus.jar” starten).
Und hier noch der Sourcecode:
Beobachter am Fluss (Sourcecode)
/*Unser Main() Programm*/
public class BeobachteramFluss {public static void main(String argv[]) {
/*Unseren Fluss anlegen*/
Fluss ruhr = new Fluss(”Ruhr”, 2.5);
/*Die drei Beobachter anlegen*/
Beobachter peter = new Beobachter1(”Peter”);
ruhr.anmeldenBeobachter(peter);
Beobachter paul = new Beobachter2(”Paul”);
ruhr.anmeldenBeobachter(paul);
Beobachter marie = new Beobachter3(”Marie”);
ruhr.anmeldenBeobachter(marie);
while (true) {
/*Zufallszahlen zwischen 0.0 und 10.0 erzeugen*/
ruhr.setPegelStand(Math.rint(Math.random() * 100) / 10);
/*Abfrage, damit wir keine Endlosschleife bekommen
* mit STRG+C abbrechen ist schliesslich langweilig.
*/
System.out.println(”\nWeitermachen (n für Nein)?: “);
byte buffer[] = new byte[255];
try {
System.in.read(buffer, 0, 255);
} catch (Exception e) {
System.out.println(”Whups, ein Fehler! TERMINATED!”);
return;
}
/*Die Puffereingabe muss noch getrimmt werden
* sonst vergleichen wir keinen Buchstaben
* sondern Leerzeichen.
*/
String s = (new String(buffer)).trim();
if (s.equals(”n”))
return;
}
}
}
/*Die Klasse für den Fluss (Name kann beliebig sein)
*Klasse Aktie abgeändert aus KE3*/
import java.util.*;
public class Fluss {
private String name;
private double pegelStand;
private ArrayList beobachterListe;
Fluss(String n, double anfangsWert) {
name = n;
pegelStand = anfangsWert;
beobachterListe = new ArrayList();
}
public void anmeldenBeobachter(Beobachter b) {
beobachterListe.add(b);
}
public String getName() {
return name;
}
public double getPegelStand() {
return pegelStand;
}
void setPegelStand(double neuerWert) {
double alterWert = pegelStand;
pegelStand = neuerWert;
System.out.println(”Die ” + name + ” hat folgenden Pegelstand: ”
+ this.getPegelStand() + ” m”);
System.out.println(””);
ListIterator it = beobachterListe.listIterator();
if (pegelStand > alterWert) {
while (it.hasNext()) {
Beobachter b = (Beobachter) it.next();
b.steigen(this);
}
} else {
while (it.hasNext()) {
Beobachter b = (Beobachter) it.next();
b.fallen(this);
}
}
}
}
/*Miniinterface*/
interface Beobachter {
void steigen(Fluss f);
void fallen(Fluss f);
}
/*Unser allgemeiner Beobachter (Superklasse)*/
public class BeobachterAllgemein implements Beobachter {
public double aktStand;
public String name;
public BeobachterAllgemein(String name) {
this.name = name;
}
public void fallen(Fluss f) {
aktStand = f.getPegelStand();
this.check();
}
public void steigen(Fluss f) {
aktStand = f.getPegelStand();
this.check();
}
public void check() {
/*Wird in den Unterklassen implementiert*/
}
}
/* Unser Beobachter für die Wasserbüffel */
public class Beobachter1 extends BeobachterAllgemein {
Beobachter1(String name) {
super(name);
}
public void check() {
if (aktStand <= (double) 0.3)
System.out.println(name + ” sagt: ”
+ “Ich muss die Wasserbüffel zusätzlich tränken!”);
else if (aktStand >= (double) 5.0 & aktStand < (double) 7.0)
System.out.println(name + ” sagt: ”
+ “Ich muss die Wasserbüffel in den Stall bringen!”);
else if (aktStand >= (double) 7.0)
System.out
.println(name
+ ” sagt: ”
+ “Uh …. der Stand ist zu hoch. Ich treibe die Büffel vom Fluss!”);
else if (aktStand > (double) 0.3 & aktStand < (double) 5.0)
System.out.println(name + ” sagt: ”
+ “Für mich gibt es nichts zu tun”);
}
}
/* Unser Beobachter für die Wasserbüffel */
public class Beobachter1 extends BeobachterAllgemein {
Beobachter1(String name) {
super(name);
}
public void check() {
if (aktStand <= (double) 0.3)
System.out.println(name + ” sagt: ”
+ “Ich muss die Wasserbüffel zusätzlich tränken!”);
else if (aktStand >= (double) 5.0 & aktStand < (double) 7.0)
System.out.println(name + ” sagt: ”
+ “Ich muss die Wasserbüffel in den Stall bringen!”);
else if (aktStand >= (double) 7.0)
System.out
.println(name
+ ” sagt: ”
+ “Uh …. der Stand ist zu hoch. Ich treibe die Büffel vom Fluss!”);
else if (aktStand > (double) 0.3 & aktStand < (double) 5.0)
System.out.println(name + ” sagt: ”
+ “Für mich gibt es nichts zu tun”);
}
}
/*Beamter der die Straße bei Überschwemung sperrt.*/
public class Beobachter3 extends BeobachterAllgemein {
private boolean schonmal = false;
Beobachter3(String name) {
super(name);
}
public void check() {
if (aktStand >= (double) 9.0) {
System.out.println(name + ” sagt: ”
+ “Alarm, Alarm! Die Straße ist überschwemmt!”);
if (!schonmal)
schonmal = true;
} else if (aktStand < (double) 9.0 & !schonmal)
System.out.println(name + ” sagt: ”
+ “Für mich gibt es nichts zu tun.”);
else {
if (aktStand < (double) 9.0 & schonmal)
System.out.println(name + ” sagt: ”
+ “Tut mir leid, die Sperre wird von einer anderen”
+ “Behörde aufgehoben. Damit habe ich nichts zu tun.”);
}
}
}
Aktuelle Kommentare