Dekoratoren
Im Detail offenbart ein zu modellierender Ausschnitt einer Geschäftswelt eine große Vielfalt an Objekten, die allgeneiner betrachtet ein und derselben Klasse angehören. Beispielsweise können die Benutzer einer Webanwendung genauer betrachtet zu folgenden Unterklassen gehören:
- Nutzer ohne Sonderrechte
- Autoren, welche die Inhalte der Anwendung liefern und pflegen
- Administratoren, welche die Verwaltung von Benutzern und Rechten verantworten
SRP mittels Vererbung implementieren
Ein naheliegender Ansatz wäre eine Klassenbibliothek, welche über Vererbung die Mengen möglicher Benutzer und ihrer Rollen implementiert: Nachteil dieses Entwurfes ist jedoch, das ein Benutzer entweder Autor oder Admin ist. Admins, die auch Autoren sind, wären hier nicht abbildbar.
SRP mittels Dekoratoren implementieren
Eine allgemeine Benutzerklasse, die bei Bedarf um Admin- oder Autor- Methoden erweitert werden kann, bietet das Dekorator- Pattern ( Details hier).
var Anton = new User(); Anton.Name = "Anton"; // Anton als Admin var AntonAsAdmin = new AdminDeco(Anton); AntonAsAdmin.CreateNewUser("Berta"); // Anton als Author var AntonAsAuthor = new AuthorDeco(Anton); AntonAsAuthor.CreateNewDoc("X99", "Designpatterns- Leitfaden");
Dekoratoren durch Erweiterungsmethoden
C# ermöglicht durch Erweiterungsmethoden die Dekoration von Klassen. So können z.B. versiegelte Klassen für eine Anwendung um Eigenaschften und Methoden erweitert werden. Die Erweitrung von IEnumerable im .NET Framework ist ein Beispiel.
public static class UserExt { public static System.Collections.ObjectModel.ObservableCollectionLogfile = new System.Collections.ObjectModel.ObservableCollection (); public static void Log(this User user, string LogMessage) { UserExt.Logfile.Add(string.Format("{0,8:s}: ({1}) {2}", DateTime.Now, user, LogMessage)); } } // ... Anwendung im Code var Anton = new User(); Anton.Name = "Anton"; // Erweiterungmethode (C# dekoriert Klassen !) Anton.Log("frisch angelegt");
Cross Cutting Concerns = Querschnittsmethoden
Cross Cutting Concerns beschreiben Funktionen, die nicht zur Kernfunktionalität einer einzelnen Klasse gehören, bei Bedarf aber dieser zugeornet werden sollen (Typische Auflistung hier). Beispiele sind das Logging von Methodenaufrufen, oder die Prüfung von Zugriffsberechtigungen beim Methodenaufruf.
Implementierung von Cross Cutting Concerns mittels Dekoratoren
Eine mögliche Implementierung von Cross Cutting Concerns sind Dekoratoren. Dies wurde oben schon mittels der Erweiterungsmethode Log implementiert.
Algorithmen über Querschnittsmethoden mittels dynamic Parameter
Implementierung von Cross Cutting Concerns mittels Unity- Interception (Proxies)
Von Unity ausgelieferte Klassen können in Proxies eingepackt werden. Diese fangen Aufrufe an die Methoden ab, und erlauben so die vereinfachte Implementierung von Cross Cutting Concerns, indem sie unabhängig von bestimmten Klassen implementiert werden können. Implementirung der Interception
Detallierte Informationen hier