homeSoftwaredesign Softwaredesign: Beispiel: Figuren verarbeiten mit Besucher Prof. Dr. Uwe Schmidt FH Wedel

Beispiel: Figuren verarbeiten mit Besucher

weiter

weiter

die abstrakte Klasse: Figur

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();
    }
}
weiter

weiter

die Klasse für Rechtecke: Rechteck

public
class Rechteck extends Figur {
 
    double breitehoehe;
 
    public Rechteck(double breite,
                    double hoehe) {
 
        this.breite = breite;
        this.hoehe  = hoehe;
    }
 
    void besuche(FigurBesucher v) {
        v.besucheRechteck(this);
    }
 
}
weiter

weiter

die Klasse für Kreise: Kreis

public
class Kreis extends Figur {
 
    double radius;
 
    public Kreis(double radius) {
        this.radius = radius;
    }
 
    void besuche(FigurBesucher v) {
        v.besucheKreis(this);
    }
 
}
weiter

weiter

die Klasse für Figuren mit Position: FigurMitPosition

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);
    }
 
}
weiter

weiter

die Klasse für zusammengesetzte Figuren: KomplexeFigur

public
class KomplexeFigur extends Figur {
 
    Figur[] teile;
 
    public
    KomplexeFigur(Figur[] teile) {
        this.teile = teile;
    }
 
    void besuche(FigurBesucher v) {
        v.besucheKomplexeFigur(this);
    }
 
    
}
weiter

weiter

die Schnittstelle für die Besucher-Klasse : FigurBesucher

interface FigurBesucher {
 
    void besucheRechteck(Rechteck r);
 
    void besucheKreis(Kreis k);
 
    void besucheFigurMitPosition(FigurMitPosition f);
 
    void besucheKomplexeFigur(KomplexeFigur f);
 
}
weiter

weiter

die Klasse für den default-Besucher: FigurBesucher0

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);
        }
    }
}
weiter

weiter

eine Klasse für die Berechnung eines Figuren-Attributs: FigurAttribut

public
class FigurAttribut extends FigurBesucher0 {
    protected
    double res = 0;
 
    public
    double getRes() {
        return
            res;
    }
}
weiter

weiter

die Klasse für das tiefe Kopieren einer Figur: FigurKopierer

public
class FigurKopierer implements FigurBesucher {
 
    private
    Figur res;
 
    public
    Figur getRes() {
        return
            res;
    }
 
    //--------------------
 
    public
    void besucheRechteck(Rechteck r) {
        res = new Rechteck(r.hoeher.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);
    }
}
weiter

weiter

der Besucher in Haskell

   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
weiter
weiter

Letzte Änderung: 03.01.2017
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel