Fortgeschrittene Entwurfsmuster in C#: Codebeispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fortgeschrittene Entwurfsmuster in C#: Von der Theorie zur Praxis



Entwurfsmuster (Design Patterns) sind bewährte Lösungen für typische Aufgaben der Softwarearchitektur. Auf Anfängerniveau lernen Entwickler Singleton, Factory oder Adapter kennen. Für die Erstellung flexibler, wartbarer und skalierbarer Systeme auf der .NET-Plattform ist jedoch die Beherrschung komplexerer Verhaltens- und Strukturmuster erforderlich. In diesem Artikel werden wir drei fortgeschrittene Muster behandeln: Chain of Responsibility, State und Visitor. Jedes Muster wird mit einem praktischen Beispiel in C# unter Verwendung moderner Sprachfunktionen (records, pattern matching, generics) veranschaulicht.



1. Chain of Responsibility (Verantwortungskette)



Das Chain of Responsibility-Muster ermöglicht es, eine Anfrage sequentiell durch eine Kette von Bearbeitern zu leiten, bis einer von ihnen die Anfrage bearbeitet. Dies vermeidet eine feste Kopplung zwischen Sender und Empfänger. In C# wird es häufig für Middleware in ASP.NET Core oder für die Datenvalidierung verwendet.



Beispiel: Zugriffsberechtigungsprüfungssystem

Angenommen, wir haben eine Anfrage zur Ausführung einer Operation. Jeder Bearbeiter prüft eine Bedingung (Authentifizierung, Autorisierung, Limits).



// Basisklasse des Bearbeiterspublic abstract class Handler{    protected Handler? NextHandler;

public void SetNext(Handler handler) => NextHandler = handler;

public abstract void Handle(RequestContext context);}

public class AuthenticationHandler : Handler{ public override void Handle(RequestContext context) { if (context.IsAuthenticated) { Console.WriteLine("Authentifizierung erfolgreich."); NextHandler?.Handle(context); } else { Console.WriteLine("Fehler: Benutzer nicht authentifiziert."); } }}

public class AuthorizationHandler : Handler{ public override void Handle(RequestContext context) { if (context.Role == "Admin") { Console.WriteLine("Autorisierung erfolgreich."); NextHandler?.Handle(context); } else { Console.WriteLine("Fehler: Nicht genügend Berechtigungen."); } }}

// Anfragekontextpublic record RequestContext(bool IsAuthenticated, string Role);

// Verwendungvar authHandler = new AuthenticationHandler();var authzHandler = new AuthorizationHandler();authHandler.SetNext(authzHandler);

var context = new RequestContext(true, "Admin");authHandler.Handle(context);// Ausgabe:// Authentifizierung erfolgreich.// Autorisierung erfolgreich.


Dieses Muster ist ideal für die Erstellung von Verarbeitungspipelines, bei denen jeder Schritt die Ausführung unterbrechen oder die Kontrolle weitergeben kann.



2. State (Zustand)



Das State-Muster ermöglicht es einem Objekt, sein Verhalten bei Änderung des internen Zustands zu ändern. Von außen sieht es so aus, als ob das Objekt seine Klasse ändert. In C# lässt es sich bequem über Schnittstellen und Komposition implementieren.



Beispiel: Bestellverwaltung in einem Online-Shop

Eine Bestellung kann sich in folgenden Zuständen befinden: Neu, Bezahlt, Versendet, Geliefert. Jeder Zustand definiert, welche Aktionen zulässig sind.



// Zustandsschnittstellepublic interface IOrderState{    void Pay(Order order);    void Ship(Order order);    void Deliver(Order order);}

// Konkrete Zuständepublic class NewOrderState : IOrderState{ public void Pay(Order order) { Console.WriteLine("Bestellung bezahlt."); order.State = new PaidOrderState(); }

public void Ship(Order order) => Console.WriteLine("Fehler: Bestellung noch nicht bezahlt."); public void Deliver(Order order) => Console.WriteLine("Fehler: Bestellung noch nicht versendet.");}

public class PaidOrderState : IOrde

Blogs

Buchempfehlungen