Menu
Coddy logo textTech

Einführung in Entwurfsmuster

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 64 von 87.

Entwurfsmuster sind bewährte Lösungen für häufige Probleme, auf die Entwickler beim Erstellen von Software immer wieder stoßen. Anstatt jedes Mal das Rad neu zu erfinden, kannst du diese erprobten Vorlagen anwenden, um wiederkehrende Herausforderungen beim Entwurf zu lösen.

Stell dir Entwurfsmuster als Baupläne vor. Sie liefern dir keinen fertigen Code zum Kopieren und Einfügen, sondern beschreiben, wie du deine Klassen und Objekte strukturierst, um eine bestimmte Art von Problem zu lösen. Die Muster, die du kennenlernen wirst, nutzen die OOP-Konzepte, die du bereits beherrschst: Vererbung, Schnittstellen, Polymorphie und Komposition.

Entwurfsmuster lassen sich in drei Hauptkategorien einteilen:

KategorieZweckBeispiele
ErzeugungsmusterWie Objekte erstellt werdenSingleton, Factory, Builder
StrukturmusterWie Objekte zusammengesetzt werdenAdapter, Decorator, Composite
VerhaltensmusterWie Objekte kommunizierenObserver, Strategy, Command

Warum sollte man Entwurfsmuster lernen? Sie geben dir ein gemeinsames Vokabular mit anderen Entwicklern: Wenn du sagst „verwende hier eine Factory“, vermittelst du sofort eine komplexe Idee. Außerdem helfen sie dir, flexibleren und leichter wartbaren Code zu schreiben, indem du Prinzipien wie „programmiere gegen eine Schnittstelle, nicht gegen eine Implementierung“ anwendest.

In den kommenden Lektionen wirst du mehrere wesentliche Muster implementieren, beginnend mit Erzeugungsmustern wie Singleton und Factory und anschließend mit Verhaltensmustern wie Observer und Strategy.

challenge icon

Aufgabe

Einfach

Lass uns einen einfachen Musterklassifizierer erstellen, der dein Verständnis der drei Kategorien von Entwurfsmustern demonstriert! Du erstellst ein System, das Muster kategorisiert und ihren Zweck erklärt, wobei dein Code auf mehrere Dateien verteilt wird.

Du erstellst drei Dateien:

  • Pattern.java: Erstelle ein Interface namens Pattern, das den Vertrag für alle Entwurfsmuster definiert. Dein Interface sollte zwei Methoden deklarieren: String getCategory(), die die Kategorie des Musters (Creational, Structural oder Behavioral) zurückgibt, und String getPurpose(), die eine Beschreibung dessen zurückgibt, was diese Kategorie von Mustern bewirkt.
  • PatternInfo.java: Erstelle drei Klassen, die dein Pattern-Interface implementieren und jeweils eine Kategorie von Entwurfsmustern darstellen:

    CreationalPattern - sollte "Creational" als Kategorie und "How objects are created" als Zweck zurückgeben.

    StructuralPattern - sollte "Structural" als Kategorie und "How objects are composed" als Zweck zurückgeben.

    BehavioralPattern - sollte "Behavioral" als Kategorie und "How objects communicate" als Zweck zurückgeben.

  • Main.java: Führe deinen Musterklassifizierer zusammen! Du erhältst eine Eingabe: den Namen eines Musters (String), der entweder "Singleton", "Factory", "Adapter", "Decorator", "Observer" oder "Strategy" sein wird.

    Erstelle basierend auf der Eingabe das passende Musterobjekt:

    • "Singleton" und "Factory" sind Creational-Muster
    • "Adapter" und "Decorator" sind Structural-Muster
    • "Observer" und "Strategy" sind Behavioral-Muster

    Speichere dein Musterobjekt in einer Variable vom Typ Pattern (dem Interface), um das Prinzip der Programmierung gegen ein Interface zu demonstrieren. Gib anschließend die folgenden drei Zeilen aus:

    Pattern: [input pattern name]

    Category: [category from getCategory()]

    Purpose: [purpose from getPurpose()]

Du erhältst eine Eingabe: den Namen eines Entwurfsmusters (String).

Diese Herausforderung festigt die zentrale Erkenntnis aus der Lektion: Entwurfsmuster werden anhand des Problems, das sie lösen, in Kategorien eingeteilt. Durch die Verwendung eines Interfaces übst du außerdem das Prinzip „Programmierung gegen ein Interface, nicht gegen eine Implementierung“ – ein grundlegendes Konzept, das Entwurfsmuster so leistungsfähig macht!

Probier es selbst

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String patternName = scanner.nextLine();
        
        // TODO: Deklariere eine Variable vom Typ Pattern (das Interface)
        Pattern pattern = null;
        
        // TODO: Erstelle basierend auf patternName das entsprechende Pattern-Objekt:
        // - "Singleton" und "Factory" sind Erzeugungsmuster
        // - "Adapter" und "Decorator" sind Strukturmuster
        // - "Observer" und "Strategy" sind Verhaltensmuster
        
        // TODO: Gib die Ausgabe im folgenden Format aus:
        // Pattern: [eingegebener Pattern-Name]
        // Category: [Kategorie von getCategory()]
        // Purpose: [Zweck von getPurpose()]
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Java-Compiler