Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. J.O. Blech Dipl.-Inform. M.J. Gawkowski Dipl.-Inform. N. Rauch Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik Lösungen zum Übungsblatt 14: Softwareentwicklung I (WS 2006/07) Aufgabe 1 Beobachter-Muster Inhalt der Datei Beobachter.java 1 2 interface Beobachter { void aktualisiere( Subjekt s ); 3 } Inhalt der Datei Subjekt.java 1 import java.util.*; 2 3 4 void meldeAb(Beobachter b); void benachrichtige(); 5 6 interface Subjekt { void meldeAn(Beobachter b); 7 } Inhalt der Datei Fahrer.java 1 2 3 public interface Fahrer { public void fortbewegen(int ziel); public boolean angekommen(); public int get_standort(); public int get_ziel(); 4 5 6 } Inhalt der Datei BrummiFahrer.java 1 2 3 public class BrummiFahrer implements Beobachter, Fahrer { private int aktueller_standort; private int bis_standort; 4 BrummiFahrer(int strecke, int ziel ){ aktueller_standort = strecke; bis_standort = ziel; } 5 6 7 8 9 10 public void aktualisiere( Subjekt s ) { return; } 11 12 13 14 public int get_standort(){ return aktueller_standort; } 15 16 17 18 public int get_ziel(){ return bis_standort; } 19 20 21 22 23 public boolean angekommen (){ return bis_standort == aktueller_standort; } 24 25 26 27 public void fortbewegen(int naechstmoegliches_ziel){ if( aktueller_standort < naechstmoegliches_ziel ) { aktueller_standort++; } } 28 29 30 31 32 33 34 } Inhalt der Datei Pendler.java 1 2 3 4 5 public class Pendler implements Beobachter, Fahrer { private int aktueller_standort; private int bis_standort; private int geschw=2; 6 7 8 9 Pendler(int strecke, int ziel){ aktueller_standort = strecke; bis_standort = ziel; } 10 11 12 13 public void aktualisiere( Subjekt s ) { geschw++; } 14 15 16 17 18 public int get_standort(){ return aktueller_standort; } 19 20 21 22 23 24 25 public int get_ziel(){ return bis_standort; } public boolean angekommen (){ return bis_standort == aktueller_standort; } 26 27 28 29 30 31 32 33 34 35 36 public void fortbewegen(int naechstmoegliches_ziel){ if( aktueller_standort < naechstmoegliches_ziel ) { if( naechstmoegliches_ziel <= (aktueller_standort+geschw) ) { aktueller_standort=naechstmoegliches_ziel; return; } aktueller_standort=aktueller_standort+geschw; } } } // class Pendler Inhalt der Datei SkiUrlauber.java 1 2 3 4 5 6 public class SkiUrlauber implements Beobachter, Fahrer private int aktueller_standort; private int bis_standort; private int geschw=3; private int pause=0; private int [] staus= new int [0]; { 7 8 9 10 11 12 SkiUrlauber(int strecke, int ziel){ aktueller_standort = strecke; bis_standort = ziel; } 13 14 15 16 17 18 19 20 public void aktualisiere( Subjekt s ) { pause=5; if (s instanceof StauWarnungsSystem) { staus = ((StauWarnungsSystem)s).getStauListe(); } } 21 22 23 24 public int get_standort(){ return aktueller_standort; } 25 26 27 28 public int get_ziel(){ return bis_standort; } 29 30 31 32 public boolean angekommen (){ return bis_standort == aktueller_standort; } 33 34 35 36 37 38 39 40 41 42 43 44 45 46 public void fortbewegen(int naechstmoegliches_ziel){ if (pause==0){ if( aktueller_standort < naechstmoegliches_ziel ) { if( naechstmoegliches_ziel <= (aktueller_standort+geschw) ) { aktueller_standort=naechstmoegliches_ziel; } else { aktueller_standort=aktueller_standort+geschw; } } } else { pause--; } } // fortbewegen 47 48 } // class SkiUrlauber 49 Inhalt der Datei StauWarnungsSystem.java 1 import java.util.*; 2 3 public class StauWarnungsSystem implements Subjekt { 2 private ArrayList beobachterListe; private int [] stausListe; 4 5 6 StauWarnungsSystem(){ beobachterListe = new ArrayList(); stausListe = new int[0]; } 7 8 9 10 11 public void setStauListe( int [] si ){ if (si.length != stausListe.length) { stausListe=si; benachrichtige(); return; } // si.length == stausList.length if(Arrays.equals(si,stausListe)) { return; } else { stausListe=si; benachrichtige(); } } // setStauInfo 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public void benachrichtige() { ListIterator it = beobachterListe.listIterator(); while( it.hasNext() ){ Beobachter b = (Beobachter)it.next(); b.aktualisiere( this ); } } 27 28 29 30 31 32 33 34 35 public void meldeAn( Beobachter b ){ beobachterListe.add( b ); } 36 37 38 39 public void meldeAb( Beobachter b ){ beobachterListe.remove( b ); } 40 41 42 43 public int [] getStauListe(){ int [] res = new int [stausListe.length]; for(int i=0;i<stausListe.length;i++){ res[i]=stausListe[i]; } return res; } 44 45 46 47 48 49 50 51 } Inhalt der Datei Strasse.java 1 import java.util.*; 2 3 4 5 6 public class Strasse{ private ArrayList fahrerliste; private int [] stauliste; 7 8 9 10 11 Strasse(){ fahrerliste = new ArrayList(); stauliste = new int [0]; } 12 13 14 15 16 Strasse(ArrayList fl, int [] staus){ fahrerliste = fl; stauliste = staus; } 17 18 19 20 void aktualisiere_staus(int [] l){ stauliste = l; } 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 int naechstmoegliches_ziel(int stand, int ziel){ if(stauliste.length==0){return ziel;} int res = ziel; // suche von "oben" nach "unten" , d.h. // // Suche nach dem ersten Stau der vor dem Fahrer ist // // ANNAHME: Staus sind aufsteigend sortiert. for(int i=stauliste.length-1; 0<=i; i--){ // es gibt mindestens einen Stau in stauliste[i] vor dem Fahrer // beziehungsweise der Fahrer steht im Stau stauliste[i] if(stand<=stauliste[i]){ res=stauliste[i]; continue; }else{ // alle Stau befinden sich hinter dem Fahrer // res==ziel oder // res==stauliste[i+1] break; } // if } // while 3 40 41 42 43 // entweder wurde res mindestens einmal überschrieben (ein Stau vor dem Fahrer) // oder nicht (alle Staus befinden sich hinter dem Fahrer) return res; } // naechstmoegliches_ziel 44 45 46 47 48 49 50 51 52 53 54 55 56 57 boolean alle_angekommen(){ boolean alle = true; ListIterator it = fahrerliste.listIterator(); while( it.hasNext() ){ Fahrer f = (Fahrer)it.next(); if( !f.angekommen() ){ alle = false; break; } } // while return alle; } // alle_angekommen 58 59 60 61 62 void verkehr_fortbewegen(){ ArrayList tmp = new ArrayList(); ListIterator it = fahrerliste.listIterator(); 63 64 65 66 67 68 69 70 71 72 while( it.hasNext() ){ Fahrer f = (Fahrer)it.next(); if( !f.angekommen() ){ int nmz = naechstmoegliches_ziel(f.get_standort(),f.get_ziel()); f.fortbewegen(nmz); }else{ tmp.add(f); } }// while 73 74 75 76 77 78 79 it = tmp.listIterator(); while( it.hasNext() ){ Fahrer f = (Fahrer)it.next(); fahrerliste.remove(f); }// while } // verkehr_fortbewegen 80 81 82 83 void add_fahrer(Fahrer f){ fahrerliste.add(f); } 84 85 86 87 void remove_fahrer(Fahrer f){ fahrerliste.remove(f); } 88 89 90 } // class Strasse Inhalt der Datei Main.java 1 import java.util.*; 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Main { public static void main( String [] argf ){ int [] [] stau_erreignise = { {23, 465}, {23, 465}, {23, 465}, {23, 34}, {23, 34}, {23, 34}, { 34, 465}, { 34, 465}, { 34, 465}, { 34, 465}, {} }; 18 19 20 21 22 23 24 25 26 27 28 29 30 StauWarnungsSystem sws = new StauWarnungsSystem(); BrummiFahrer f1 = new BrummiFahrer(34,55); SkiUrlauber f2 = new SkiUrlauber(56,78); Pendler f3 = new Pendler(23,40); Strasse strasse = new Strasse(); strasse.add_fahrer(f1); strasse.add_fahrer(f2); strasse.add_fahrer(f3); sws.meldeAn(f1); sws.meldeAn(f2); sws.meldeAn(f3); 31 32 33 34 35 36 int zeitpunkt = 0; while(zeitpunkt < stau_erreignise.length){ sws.setStauListe(stau_erreignise[zeitpunkt]); strasse.aktualisiere_staus(stau_erreignise[zeitpunkt]); strasse.verkehr_fortbewegen(); 4 37 38 zeitpunkt++; } // while 39 40 41 } // main } // class Main Aufgabe 2 Vererbung zugeordnet beschreibt 1 * 2 Punkt Strecke +koord_x: float +koord_y: float +von: Punkt +bis: Punkt 2 1 beschreibt farbPunkt +color: java.awt.Clolor * 1 Rechteck +linksunten: Punkt +rechtsoben: Punkt +punkte: ArrayList +strecken: ArrayList * 1 1 1 zugeordnet zugeordnet zugeordnet farbStrecke +color: java.awt.Color * farbRechteck +hintergrund: java.awt.Color Abbildung 1: Das Klassendiagramm2 5 Aufgabe 3 Realisieren von Typhierarchien class Fahrzeug { String antrieb = "Reader"; String getAntrieb(){ return antrieb; } } interface ISchiff{ String getAntrieb(); } class Schiff implements ISchiff{ String antrieb = "Propeller"; String getAntrieb(){ return antrieb; } } class Amphibie extends Fahrzeug { Schiff schiff = new Schiff(); String getAntrieb(){ return super.Fahrzeug.getAntrieb() + "und" + schiff.getAntrieb(); } } class Hovecraf extends Fahrzeug { String antrieb = "Luftkissen"; Schiff schiff = new Schiff(); String getAntrieb(){ return antrieb + "und" + schiff.getAntrieb(); } } 6