Einführung in Entwurfsmuster
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 51 von 70.
Entwurfsmuster sind bewährte Lösungen für häufige Probleme, auf die Entwickler beim wiederholten Erstellen von Software stoßen. Anstatt jedes Mal das Rad neu zu erfinden, bieten uns Muster ein gemeinsames Vokabular und erprobte Ansätze zur Strukturierung von Code.
Stell dir Entwurfsmuster als Baupläne vor. Sie liefern dir keinen exakten Code zum Kopieren, sondern beschreiben, wie Klassen und Objekte organisiert werden, um bestimmte Herausforderungen zu lösen. Wenn jemand erwähnt: „Verwende hier das Factory-Muster“, verstehen erfahrene Entwickler sofort die allgemeine vorgeschlagene Struktur.
Entwurfsmuster fallen in drei Hauptkategorien:
| Kategorie | Zweck | Beispiele |
|---|---|---|
| Erzeugungsmuster | Wie Objekte erstellt werden | Singleton, Factory |
| Strukturmuster | Wie Objekte zusammengesetzt werden | Adapter, Decorator |
| Verhaltensmuster | Wie Objekte kommunizieren | Observer, Strategy |
Die Muster, die wir untersuchen werden, bauen direkt auf OOP-Konzepten auf, die Sie bereits gelernt haben – Interfaces, Vererbung, Polymorphismus und Komposition. Jedes Muster nutzt diese Grundlagen auf spezifische Weise, um Flexibilität, Wartbarkeit oder Wiederverwendbarkeit zu erreichen.
In den kommenden Lektionen implementierst du mehrere wichtige Muster, beginnend mit Singleton, Factory, Observer und Strategy. Wenn du diese Muster verstehst, kannst du gängige Lösungen in bestehenden Codebasen erkennen und bessere Architekturentscheidungen in deinen eigenen Projekten treffen.
Aufgabe
EinfachLass uns ein einfaches Katalogsystem für Entwurfsmuster erstellen, das Informationen zu Entwurfsmustern über mehrere Dateien hinweg organisiert. Dadurch verstehst du besser, wie Muster kategorisiert werden, und übst gleichzeitig eine gute Codeorganisation.
Du erstellst drei Dateien, um verschiedene Verantwortlichkeiten zu trennen:
Pattern.cs: Definiere einePattern-Klasse im NamespacePatterns, die ein einzelnes Entwurfsmuster darstellt. Jedes Muster sollte über einenName, eineCategory(Creational, Structural oder Behavioral) und eineDescriptionverfügen. Füge eine MethodeGetSummary()ein, die eine formatierte Zeichenfolge zurückgibt:[{Category}] {Name}: {Description}PatternCatalog.cs: Erstelle einePatternCatalog-Klasse im NamespacePatterns, die eine Sammlung von Mustern verwaltet. Dein Katalog sollte Muster hinzufügen können und über eine MethodeGetPatternsByCategory(string category)verfügen, die eine Liste aller Muster zurückgibt, die dieser Kategorie entsprechen. Füge außerdem eine MethodeGetAllSummaries()ein, die eine Liste von Zusammenfassungszeichenfolgen für alle Muster im Katalog zurückgibt.Program.cs: Führe alles zusammen, indem du einen Katalog erstellst und ihn anhand der Eingabe mit Mustern befüllst. Zeige anschließend die nach Kategorie gefilterten Muster an.
Du erhältst die folgenden Eingaben:
- Anzahl der hinzuzufügenden Muster
- Für jedes Muster: drei Zeilen mit Name, Kategorie und Beschreibung
- Eine Kategorie, nach der gefiltert werden soll
Nachdem du alle Muster zu deinem Katalog hinzugefügt hast, gib die Zusammenfassungen der Muster aus, die der Filterkategorie entsprechen, jeweils eine pro Zeile. Wenn keine Muster übereinstimmen, gib No patterns found aus.
Wenn die Eingaben beispielsweise folgendermaßen lauten:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
CreationalDie Ausgabe sollte folgendermaßen aussehen:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classDiese Aufgabe zeigt, wie die Organisation zusammengehöriger Klassen in separaten Dateien deine Codebasis übersichtlich und wartbar hält – ein Prinzip, das noch wichtiger wird, wenn du in den kommenden Lektionen tatsächliche Entwurfsmuster implementierst!
Probier es selbst
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// Lies die Anzahl der Muster ein
int n = Convert.ToInt32(Console.ReadLine());
// Erstelle einen neuen PatternCatalog
PatternCatalog catalog = new PatternCatalog();
// TODO: Lies die Details jedes Musters ein (name, category, description)
// und füge sie dem Katalog hinzu
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: Erstelle ein Pattern und füge es dem Katalog hinzu
}
// Lies die Kategorie ein, nach der gefiltert werden soll
string filterCategory = Console.ReadLine();
// TODO: Rufe die Muster der Filterkategorie ab
// und gib deren Zusammenfassungen aus
// Wenn keine Muster übereinstimmen, gib "No patterns found" aus
}
}
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 DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – SchülerdatenÜbe selbstständig: Online-C#-Compiler