Einführung in Design Patterns
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 51 von 70.
Design Patterns (Entwurfsmuster) sind bewährte Lösungen für häufig auftretende Probleme, denen Entwickler beim Erstellen von Software immer wieder begegnen. Anstatt das Rad jedes Mal neu zu erfinden, bieten Patterns uns ein gemeinsames Vokabular und bewährte Ansätze zur Strukturierung von Code.
Betrachten Sie Entwurfsmuster als Baupläne. Sie liefern Ihnen keinen exakten Code zum Kopieren, sondern beschreiben, wie Klassen und Objekte organisiert werden sollten, um spezifische Herausforderungen zu lösen. Wenn jemand erwähnt, „verwende hier das Factory-Pattern“, verstehen erfahrene Entwickler sofort die vorgeschlagene allgemeine Struktur.
Entwurfsmuster lassen sich in drei Hauptkategorien unterteilen:
| 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 werden Sie mehrere wesentliche Entwurfsmuster implementieren, beginnend mit Singleton, Factory, Observer und Strategy. Das Verständnis dieser Muster wird Ihnen helfen, gängige Lösungen in bestehenden Codebasen zu erkennen und bessere Architektur-Entscheidungen in Ihren eigenen Projekten zu treffen.
Aufgabe
EinfachLassen Sie uns ein einfaches Musterkatalog-System erstellen, das Informationen über Entwurfsmuster über mehrere Dateien hinweg organisiert. Dies wird Ihnen helfen zu verstehen, wie Muster kategorisiert werden, während Sie gleichzeitig eine gute Code-Organisation üben.
Sie werden drei Dateien erstellen, um verschiedene Verantwortlichkeiten zu trennen:
Pattern.cs: Definieren Sie einePattern-Klasse im NamespacePatterns, die ein einzelnes Entwurfsmuster repräsentiert. Jedes Muster sollte einenName, eineCategory(Creational, Structural oder Behavioral) und eineDescriptionhaben. Fügen Sie eine MethodeGetSummary()hinzu, die einen formatierten String zurückgibt:[{Category}] {Name}: {Description}PatternCatalog.cs: Erstellen Sie einePatternCatalog-Klasse im NamespacePatterns, die eine Sammlung von Mustern verwaltet. Ihr Katalog sollte in der Lage sein, Muster hinzuzufügen, und über eine MethodeGetPatternsByCategory(string category)verfügen, die eine Liste aller Muster zurückgibt, die dieser Kategorie entsprechen. Fügen Sie außerdem eine MethodeGetAllSummaries()hinzu, die eine Liste von Zusammenfassungs-Strings für alle Muster im Katalog zurückgibt.Program.cs: Führen Sie alles zusammen, indem Sie einen Katalog erstellen und ihn basierend auf der Eingabe mit Mustern füllen. Zeigen Sie dann die nach Kategorie gefilterten Muster an.
Sie erhalten die folgenden Eingaben:
- Anzahl der hinzuzufügenden Muster
- Für jedes Muster: drei Zeilen, die Name, Kategorie und Beschreibung enthalten
- Eine Kategorie, nach der gefiltert werden soll
Nachdem Sie alle Muster zu Ihrem Katalog hinzugefügt haben, geben Sie die Zusammenfassungen der Muster aus, die der Filterkategorie entsprechen, eine pro Zeile. Wenn keine Muster übereinstimmen, geben Sie No patterns found aus.
Wenn die Eingaben zum Beispiel wie folgt lauten:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
CreationalSollte die Ausgabe wie folgt aussehen:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classDiese Herausforderung zeigt, wie die Organisation verwandter Klassen in separaten Dateien Ihre Codebasis sauber und wartbar hält – ein Prinzip, das noch wichtiger wird, wenn Sie in den kommenden Lektionen tatsächliche Entwurfsmuster implementieren!
Spickzettel
Design Patterns sind bewährte Lösungen für häufige Probleme in der Softwareentwicklung. Sie bieten Entwürfe für die Organisation von Klassen und Objekten, anstatt exakten Code zum Kopieren bereitzustellen.
Design Patterns lassen sich in drei Hauptkategorien unterteilen:
| Kategorie | Zweck | Beispiele |
|---|---|---|
| Erzeugungsmuster | Wie Objekte erstellt werden | Singleton, Factory |
| Strukturmuster | Wie Objekte zusammengesetzt werden | Adapter, Decorator |
| Verhaltensmuster | Wie Objekte kommunizieren | Observer, Strategy |
Design Patterns bauen auf OOP-Konzepten wie Interfaces, Vererbung, Polymorphie und Komposition auf, um Flexibilität, Wartbarkeit und Wiederverwendbarkeit zu erreichen.
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. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste10Design Patterns Teil 1
Einführung in Design PatternsThread-sicheres SingletonFactory PatternObserver Pattern (Events)Strategy Pattern2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten