Einführung in Design Patterns
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 64 von 87.
Design Patterns (Entwurfsmuster) sind bewährte Lösungen für häufige Probleme, auf die Entwickler beim Erstellen von Software immer wieder stoßen. Anstatt das Rad jedes Mal neu zu erfinden, können Sie diese praxiserprobten Vorlagen anwenden, um wiederkehrende Design-Herausforderungen zu lösen.
Betrachten Sie Entwurfsmuster als Baupläne. Sie liefern Ihnen keinen fertigen Code zum Kopieren und Einfügen, sondern beschreiben, wie Sie Ihre Klassen und Objekte strukturieren, um eine bestimmte Art von Problem zu lösen. Die Muster, die Sie lernen werden, nutzen die OOP-Konzepte, die Sie bereits beherrschen – Vererbung, Schnittstellen, Polymorphie und Komposition.
Entwurfsmuster lassen sich in drei Hauptkategorien unterteilen:
| 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 bieten Ihnen ein gemeinsames Vokabular mit anderen Entwicklern – die Aussage „Verwenden Sie hier eine Factory“ vermittelt sofort eine komplexe Idee. Sie helfen Ihnen auch dabei, flexibleren und wartbareren Code zu schreiben, indem sie Prinzipien wie „Programmieren Sie gegen eine Schnittstelle, nicht gegen eine Implementierung“ anwenden.
In den kommenden Lektionen werden Sie mehrere wesentliche Muster implementieren, beginnend mit Erzeugungsmustern wie Singleton und Factory, und dann zu Verhaltensmustern wie Observer und Strategy übergehen.
Aufgabe
EinfachLassen Sie uns einen einfachen Muster-Klassifizierer erstellen, der Ihr Verständnis der drei Entwurfsmuster-Kategorien demonstriert! Sie werden ein System erstellen, das Muster kategorisiert und deren Zweck erklärt, wobei Sie Ihren Code über mehrere Dateien organisieren.
Sie werden drei Dateien erstellen:
Pattern.java: Erstellen Sie ein Interface namensPattern, das den Vertrag für alle Entwurfsmuster definiert. Ihr Interface sollte zwei Methoden deklarieren:String getCategory(), die die Kategorie des Musters zurückgibt (Creational, Structural oder Behavioral), undString getPurpose(), die eine Beschreibung dessen zurückgibt, was diese Kategorie von Mustern tut.PatternInfo.java: Erstellen Sie drei Klassen, die IhrPattern-Interface implementieren und jeweils eine Kategorie von Entwurfsmustern repräsentieren:CreationalPattern- sollte"Creational"für die Kategorie und"How objects are created"für den Zweck zurückgeben.StructuralPattern- sollte"Structural"für die Kategorie und"How objects are composed"für den Zweck zurückgeben.BehavioralPattern- sollte"Behavioral"für die Kategorie und"How objects communicate"für den Zweck zurückgeben.Main.java: Bringen Sie Ihren Muster-Klassifizierer zusammen! Sie erhalten eine Eingabe: einen Musternamen (String), der einer der folgenden Werte sein wird:"Singleton","Factory","Adapter","Decorator","Observer"oder"Strategy".Erstellen Sie basierend auf der Eingabe das entsprechende Muster-Objekt:
"Singleton"und"Factory"sind Creational-Muster"Adapter"und"Decorator"sind Structural-Muster"Observer"und"Strategy"sind Behavioral-Muster
Speichern Sie Ihr Muster-Objekt in einer Variablen vom Typ
Pattern(dem Interface), was das Prinzip der Programmierung gegen ein Interface demonstriert. Geben Sie dann die folgenden drei Zeilen aus:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
Sie erhalten eine Eingabe: den Namen eines Entwurfsmusters (String).
Diese Herausforderung vertieft die wichtigste Erkenntnis aus der Lektion: Entwurfsmuster sind in Kategorien unterteilt, basierend darauf, welches Problem sie lösen. Durch die Verwendung eines Interfaces praktizieren Sie auch das Prinzip "Programmieren gegen ein Interface, nicht gegen eine Implementierung" – ein Kernkonzept, das Entwurfsmuster so mächtig macht!
Spickzettel
Entwurfsmuster sind bewährte Lösungen für häufig auftretende Probleme in der Softwareentwicklung. Sie sind Blaupausen, die beschreiben, wie Klassen und Objekte strukturiert werden sollten, um spezifische Arten von Problemen zu lösen.
Entwurfsmuster lassen sich in drei Hauptkategorien unterteilen:
| Kategorie | Zweck | Beispiele |
|---|---|---|
| Erzeugungsmuster | Wie Objekte erstellt werden | Singleton, Factory, Builder |
| Strukturmuster | Wie Objekte zusammengesetzt sind | Adapter, Decorator, Composite |
| Verhaltensmuster | Wie Objekte kommunizieren | Observer, Strategy, Command |
Entwurfsmuster bieten ein gemeinsames Vokabular unter Entwicklern und helfen dabei, flexibleren und wartbareren Code zu schreiben, indem Prinzipien wie „Programmieren gegen eine Schnittstelle, nicht gegen eine Implementierung“ angewendet werden.
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: Basierend auf patternName, erstelle 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: [input 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 this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem