Softwaredesign: Beispiel: Figuren verarbeiten mit Besucher |
abstract
public
class Figur {
abstract
void besuche(FigurBesucher v);
//--------------------
double attribut(FigurAttribut va) {
besuche(va);
return
va.getRes();
}
//--------------------
public
double umfang() {
return
attribut(new FigurAttribut() {
public
void besucheRechteck(Rechteck r) {
res += 2 * (r.breite + r.hoehe);
}
public
void besucheKreis(Kreis k) {
res += 2 * java.lang.Math.PI * k.radius;
}
});
}
//--------------------
public
double flaeche() {
return
attribut(new FigurAttribut() {
public
void besucheRechteck(Rechteck r) {
res += r.breite * r.hoehe;
}
public
void besucheKreis(Kreis k) {
res += java.lang.Math.PI * k.radius * k.radius;
}
});
}
//--------------------
public
Figur kopiere() {
FigurKopierer fk = new FigurKopierer();
besuche(fk);
return
fk.getRes();
}
}
|
public
class Rechteck extends Figur {
double breite, hoehe;
public Rechteck(double breite,
double hoehe) {
this.breite = breite;
this.hoehe = hoehe;
}
void besuche(FigurBesucher v) {
v.besucheRechteck(this);
}
}
|
public
class Kreis extends Figur {
double radius;
public Kreis(double radius) {
this.radius = radius;
}
void besuche(FigurBesucher v) {
v.besucheKreis(this);
}
}
|
public
class FigurMitPosition extends Figur {
double x,y;
Figur figur;
public FigurMitPosition(double x,
double y,
Figur figur) {
this.x = x;
this.y = y;
this.figur = figur;
}
void besuche(FigurBesucher v) {
v.besucheFigurMitPosition(this);
}
}
|
public
class KomplexeFigur extends Figur {
Figur[] teile;
public
KomplexeFigur(Figur[] teile) {
this.teile = teile;
}
void besuche(FigurBesucher v) {
v.besucheKomplexeFigur(this);
}
}
|
interface FigurBesucher {
void besucheRechteck(Rechteck r);
void besucheKreis(Kreis k);
void besucheFigurMitPosition(FigurMitPosition f);
void besucheKomplexeFigur(KomplexeFigur f);
}
|
public
class FigurBesucher0 implements FigurBesucher {
public
void besucheRechteck(Rechteck r) {}
public
void besucheKreis(Kreis k) {}
public
void besucheFigurMitPosition(FigurMitPosition f) {
f.figur.besuche(this);
}
public
void besucheKomplexeFigur(KomplexeFigur f) {
for ( int i = 0;
i < f.teile.length;
++i ) {
f.teile[i].besuche(this);
}
}
}
|
public
class FigurAttribut extends FigurBesucher0 {
protected
double res = 0;
public
double getRes() {
return
res;
}
}
|
public
class FigurKopierer implements FigurBesucher {
private
Figur res;
public
Figur getRes() {
return
res;
}
//--------------------
public
void besucheRechteck(Rechteck r) {
res = new Rechteck(r.hoehe, r.breite);
}
public
void besucheKreis(Kreis k) {
res = new Kreis(k.radius);
}
public
void besucheFigurMitPosition(FigurMitPosition f) {
f.figur.besuche(this);
res = new FigurMitPosition(f.x,f.y,res);
}
public
void besucheKomplexeFigur(KomplexeFigur f) {
Figur[] teile = new Figur[f.teile.length];
for ( int i = 0;
i < f.teile.length;
++i ) {
f.teile[i].besuche(this);
teile[i] = res;
}
res = new KomplexeFigur(teile);
}
}
|
1module Figur where
2
3data Figur = Rechteck { breite :: Double
4 , hoehe :: Double
5 }
6 | Kreis { radius :: Double
7 }
8 | MitPos { x :: Double
9 , y :: Double
10 , f :: Figur
11 }
12 | Komplex { teile :: [Figur] }
13
14-- ----------------------------------------
15
16visit :: (Double -> Double -> res) ->
17 (Double -> res) ->
18 (Double -> Double -> res -> res) ->
19 ([res] -> res) ->
20 Figur -> res
21
22visit pRechteck pKreis pMitPos pKomplex = go
23 where
24 go (Rechteck b h) = pRechteck b h
25 go (Kreis r ) = pKreis r
26 go (MitPos x y f) = pMitPos x y (go f)
27 go (Komplex fs) = pKomplex (map go fs)
28
29-- ----------------------------------------
30
31umfang :: Figur -> Double
32umfang = visit
33 (\ b h -> 2 * b * h)
34 (\ r -> 2 * pi * r)
35 (\ x y u -> u)
36 sum
37
38flaeche :: Figur -> Double
39flaeche = visit
40 (\ b h -> b * h)
41 (\ r -> pi * r^2)
42 (\ x y f -> f)
43 sum
44
45-- die id-Funktion
46klonen :: Figur -> Figur
47klonen = visit Rechteck Kreis MitPos Komplex
|
Letzte Änderung: 03.01.2017 | © Prof. Dr. Uwe Schmidt |