Lösungen zum Übungsblatt 14

Werbung
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
Herunterladen