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:
| Kategorie | Zweck | Beispiele |
|---|---|---|
| Erzeugungsmuster | Wie Objekte erstellt werden | Singleton, Factory, Builder |
| Strukturmuster | Wie Objekte zusammengesetzt werden | Adapter, Decorator, Composite |
| Verhaltensmuster | Wie Objekte kommunizieren | Observer, 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.
Aufgabe
EinfachLass 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 namensPattern, 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, undString getPurpose(), die eine Beschreibung dessen zurückgibt, was diese Kategorie von Mustern bewirkt.PatternInfo.java: Erstelle drei Klassen, die deinPattern-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()]
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler