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:

  1. Ein Fluss (Die Ruhr)
  2. Ein Beobachter der auf Wasserbüffel aufpasst
  3. Ein Beobachter der einen Wanderweg im Auge behält
  4. Ein Beobachter der auf eine Strasse über den Fluss acht gibt

Aktionen:

  1. Der Fluß verändert per Zufallssteuerung seinen Pegelstand zwischen 0 und 10 Metern
  2. 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
  3. Beobachter 2 meldet bei <= 1m dass der Fluss durchwatet werden kann und bei >=6m, dass der Wanderweg überschwemmt ist
  4. 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.”);
}
}
}

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>