Muster erkennen. Idee: Fassade.

Mappenz

Bekanntes Mitglied
Hi,

ich habe folgende Klassen zu verschönern.

Java:
public class Kartoffeln {
    void zubereiten() {
        /* Der Rumpf der Methode zubereiten() darf nicht verändert werden! */
        setzeWasserAuf();
        kochen();
        abseihen();
        ladeAufTeller();
    }

    void ladeAufTeller() {
        System.out.println("Essen auf den Teller geladen.");
    }

    void abseihen() {
        System.out.println("Kartoffeln nun im Sieb.");
    }

    void kochen() {
        System.out.println("Kartoffeln kochen jetzt.");
    }

    void setzeWasserAuf() {
        System.out.println("Wasser aufgesetzt und nun kochend.");
    }
}

Java:
public class Main {

    /**
     * @param args Kommandozeilenargumente
     * 
     * In den drei Klassen stimmt die Methode zubereiten() zwar überein,
     * aber die darin aufgerufenen Methoden unterscheiden sich in dem,
     * was sie ausführen - das könnte man bestimmt schöner und mit weniger
     * Quelltextverdopplung lösen ...
     * 
     * (Die Methode main() darf nicht angefasst werden!)
     */
    public static void main(String[] args) {
        Kartoffeln meineKartoffeln = new Kartoffeln();
        meineKartoffeln.zubereiten();
        
        Nudeln meineNudeln = new Nudeln();
        meineNudeln.zubereiten();

        Reis meinReis = new Reis();
        meinReis.zubereiten();
    }

}

Java:
public class Nudeln {
    void zubereiten() {
        /* Der Rumpf der Methode zubereiten() darf nicht verändert werden! */
        setzeWasserAuf();
        kochen();
        abseihen();
        ladeAufTeller();
    }

    void ladeAufTeller() {
        System.out.println("Essen auf den Teller geladen.");
    }

    void abseihen() {
        System.out.println("Nudeln nun im Sieb.");
    }

    void kochen() {
        System.out.println("Nudeln kochen jetzt.");
    }

    void setzeWasserAuf() {
        System.out.println("Wasser aufgesetzt und nun kochend.");
    }
}

Java:
public class Reis {
    void zubereiten() {
        /* Der Rumpf der Methode zubereiten() darf nicht verändert werden! */
        setzeWasserAuf();
        kochen();
        abseihen();
        ladeAufTeller();
    }

    void ladeAufTeller() {
        System.out.println("Essen auf den Teller geladen.");
    }

    void abseihen() {
        System.out.println("Reis nun im Sieb.");
    }

    void kochen() {
        System.out.println("Reis kocht jetzt.");
    }

    void setzeWasserAuf() {
        System.out.println("Wasser aufgesetzt und nun kochend.");
    }
}

Ich habe einfach alles in eine abstrakte Superklasse gezogen, dabei sind
Code:
abseihen()
und
Code:
kochen()
abstrakt und müssen in den Unterklassen implementiert werden. Damit sind alle Codeverdoppelungen aus der Welt, der Code sieht für mich gut aus und ich bin zufrieden. Ich kann kein Muster erkennen, am ehesten noch Fassade. Was meint ihr zur Lösung und zum "erkannten" Muster?

Gruß
Michi
 
Wo siehst du denn deine Facade? (Mal abgeseheen davon, dass du uns den veränderten Code mit der angebl. Facade nicht zeigst...)

Nach deiner Beschreibung würde ich zum Template Pattern / Schablonen Muster tendieren.

Ps: Man kann Muster auch erlernen (womöglich sogar besser), wenn man "guten" Code von anderen liest und dann die Muster erkennt.
 
naja, die Fassade sehe ich darin, dass ich eine einheitliche Schnittstelle zu den Klassen die ich jetzt habe anbiete.

Den fertigen Code würde ich ungerne Zeigen, denn Kopien werden hart abgestraft. Aber es ist auch nichts Kompliziertes, einfach alles aus den 3 Speisen in eine Superklasse ziehen und die Subklassen zwingen die individuell ausgeprägten Methoden zu überschreiben.
 

Zurück
Oben