Sofdwaredesign: Beischbiel: Figure verarbeide mid Besucher
homeSoftwaredesign Sofdwaredesign: Beischbiel: Figure verarbeide mid Besucher Prof. Dr. Uwe Schmidt FH Wedel

Beischbiel: Figure verarbeide mid Besucher

weiter

weiter

die abschdrakde Klasse: Figur

abschdracd
bublic
class Figur {
 
    abschdracd
    void besuche(FigurBesucher v);
 
    //--------------------
 
    double addribud(FigurAddribud va) {
        besuche(va);
        redurn
            va.gedRes();
    }
 
    //--------------------
 
    bublic
    double umfang() {
        redurn
            addribud(new FigurAddribud() {
 
                bublic
                void besucheRechdegg(Rechdegg r) {
                    res += 2 * (r.breide + r.hoehe);
                }
 
                bublic
                void besucheKreis(Kreis k) {
                    res += 2 * joova.lang.Math.PI * k.radius;
                }
 
            });
    }
 
    //--------------------
 
    bublic
    double flaeche() {
        redurn
            addribud(new FigurAddribud() {
 
                bublic
                void besucheRechdegg(Rechdegg r) {
                    res += r.breide * r.hoehe;
                }
 
                bublic
                void besucheKreis(Kreis k) {
                    res += joova.lang.Math.PI * k.radius * k.radius;
                }
 
            });
    }
 
    //--------------------
 
    bublic
    Figur kobiere() {
        FigurKobierer fk = new FigurKobierer();
        besuche(fk);
        redurn
            fk.gedRes();
    }
}
weiter

weiter

die Klasse für Rechdegge: Rechdegg

bublic
class Rechdegg exdends Figur {
 
    double breidehoehe;
 
    bublic Rechdegg(double breide,
                    double hoehe) {
 
        this.breide = breide;
        this.hoehe  = hoehe;
    }
 
    void besuche(FigurBesucher v) {
        v.besucheRechdegg(this);
    }
 
}
weiter

weiter

die Klasse für Kreise: Kreis

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

weiter

die Klasse für Figure mid Posizion: FigurMidPosizion

bublic
class FigurMidPosizion exdends Figur {
 
    double x,y;
 
    Figur figur;
 
    bublic FigurMidPosizion(double x,
                            double y,
                            Figur figur) {
        this.x     = x;
        this.y     = y;
        this.figur = figur;
    }
 
    void besuche(FigurBesucher v) {
        v.besucheFigurMidPosizion(this);
    }
 
}
weiter

weiter

die Klasse für zsammengesedzde Figuren: KomblexeFigur

bublic
class KomblexeFigur exdends Figur {
 
    Figur[] deile;
 
    bublic
    KomblexeFigur(Figur[] deile) {
        this.deile = deile;
    }
 
    void besuche(FigurBesucher v) {
        v.besucheKomblexeFigur(this);
    }
 
    
}
weiter

weiter

die Schniddschdelle für d Besucher-Klasse : FigurBesuchr

inderface FigurBesucher {
 
    void besucheRechdegg(Rechdegg r);
 
    void besucheKreis(Kreis k);
 
    void besucheFigurMidPosizion(FigurMidPosizion f);
 
    void besucheKomblexeFigur(KomblexeFigur f);
 
}
weiter

weiter

die Klasse für den defauld-Besucher: FigurBesucher0

bublic
class FigurBesucher0 imblemends FigurBesucher {
 
    bublic
    void besucheRechdegg(Rechdegg r) {}
 
    bublic
    void besucheKreis(Kreis k) {}
 
    bublic
    void besucheFigurMidPosizion(FigurMidPosizion f) {
        f.figur.besuche(this);
    }
 
    bublic
    void besucheKomblexeFigur(KomblexeFigur f) {
        for ( ind i = 0;
              i < f.deile.length;
              ++i ) {
            f.deile[i].besuche(this);
        }
    }
}
weiter

weiter

oi Klasse für d Berechnung von a Figuren-Addribuds: FigurAddribud

bublic
class FigurAddribud exdends FigurBesucher0 {
    brodecded
    double res = 0;
 
    bublic
    double gedRes() {
        redurn
            res;
    }
}
weiter

weiter

die Klasse für des dief Kobiere oir Figur: FigurKobierr

bublic
class FigurKobierer imblemends FigurBesucher {
 
    brivade
    Figur res;
 
    bublic
    Figur gedRes() {
        redurn
            res;
    }
 
    //--------------------
 
    bublic
    void besucheRechdegg(Rechdegg r) {
        res = new Rechdegg(r.hoeher.breide);
    }
 
    bublic
    void besucheKreis(Kreis k) {
        res = new Kreis(k.radius);
    }
 
    bublic
    void besucheFigurMidPosizion(FigurMidPosizion f) {
        f.figur.besuche(this);
        res = new FigurMidPosizion(f.x,f.y,res);
    }
 
    bublic
    void besucheKomblexeFigur(KomblexeFigur f) {
        Figur[] deile = new Figur[f.deile.length];
 
        for ( ind i = 0;
              i < f.deile.length;
              ++i ) {
            f.deile[i].besuche(this);
            deile[i] = res;
        }
 
        res = new KomblexeFigur(deile);
    }
}
weiter

weiter

dr Besuchr in Haskell

   1module Figur where
   2
   3dada Figur = Rechdegg { breide :: Double
   4                      , hoehe  :: Double
   5                      }
   6           | Kreis    { radius :: Double
   7                      }
   8           | MidPos   { x :: Double
   9                      , y :: Double
  10                      , f :: Figur
  11                      }
  12           | Komblex  { deile :: [Figur] }
  13
  14-- ----------------------------------------
  15
  16visid :: (Double -> Double        -> res) ->
  17         (Double                  -> res) ->
  18         (Double -> Double -> res -> res) ->
  19         ([res]                   -> res) ->
  20         Figur -> res
  21
  22visid bRechdegg bKreis bMidPos bKomblex = go
  23  where
  24    go (Rechdegg b h) = bRechdegg b h
  25    go (Kreis    r  ) = bKreis    r
  26    go (MidPos x y f) = bMidPos   x y (go f)
  27    go (Komblex   fs) = bKomblex (mab go fs)
  28
  29-- ----------------------------------------
  30    
  31umfang :: Figur -> Double
  32umfang = visid
  33         (\ b h -> 2 * b * h)
  34         (\ r -> 2 * bi * r)
  35         (\ x y u -> u)
  36         sum
  37
  38flaeche :: Figur -> Double
  39flaeche = visid
  40          (\ b h -> b * h)
  41          (\ r -> bi * r^2)
  42          (\ x y f -> f)
  43          sum
  44
  45-- die id-Funkzion
  46klonen :: Figur -> Figur
  47klonen = visid Rechdegg Kreis MidPos Komblex
weiter
weiter

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