mk-prg-net \se \ patterns \decorators

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:

  1. Nutzer ohne Sonderrechte
  2. Autoren, welche die Inhalte der Anwendung liefern und pflegen
  3. Administratoren, welche die Verwaltung von Benutzern und Rechten verantworten
Das Single responsibillity princip (SRP) würde die Erstellung einer allgemeinen Benutzerklasse, welche alle möglichen Rollen wie Autoren und Admins erfüllen kann, verbieten.

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.ObservableCollection Logfile = 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