Einführung:
Wiedermal darf ich ein Entwurfsmuster kennenlernen. Diesmal ist es das
Decorator Pattern. Um es vorweg zu nehmen, bei der folgenden kleinen “Vorstellung” des Decoratorpattern, wird das Entwurfsmuster nicht in Kombination mit dem Factory Pattern aufgezeigt. Es geht einzig um das Decorator Pattern.
Das Decoratorpattern kann man in einem UML Klassendiagramm so aufzeichnen :
Defintion:
Das Decoratormuster fügt einem Objekt dynamisch zusätzliche Verantwortlichkeiten hinzu. Dekorierer bieten eine flexible Alternative zur Ableitung von Unterklassen zum Zweck der Erweiterung der Funktionalität.
Zusammenfassung:
Die Definition sagt nichts anderes aus, als dass die oben aufgezeichneten Komponenten dynamisch erweitert (oder eben dekoriert) werden können. Dynamisch bedeutet hier, dass man die Funktionalitäten zur Laufzeit beliebig hinzufügen kann.
Beispiel - Ein Menü Dekorierer :-)
Das Beispiel hat nichts mit dem Programmieralltag zu tun. Jedoch eigenen sich Menü’s extrem zum dekorieren.
Es gibt in einem Restaurant zwei Menues (Menü 1 und Menu 2). Ein Kunde kann aber diese Menues beliebig erweitern wie er will. D.h. er kann zu einem Menu noch ein Hamburger, Pommes Frites oder Nuggets bestellen. Dies bedeutet, dass er die beiden Menues um die Zutaten beliebig erweitern (oder eben “dekorieren” ) kann.
Das Klassendiagramm dieser Menues sieht dann auf das Decoratormuster umgesetzt so aus :
Implementierung (auf Restaurant - Beispiel bezogen)
Abstrakte Komponenten Klasse (Menu) :
C#-Code: |
public abstract class Menu
{
protected string description = "menu";
public abstract string Description { get; }
public abstract double Preis();
}
|
Eine konkrete Komponente (Menu_1):
C#-Code: |
public class Menu_1 : Menu
{
public Menu_1()
{
this.description = "Menu_1";
}
public override double Preis()
{
return 11.00;
}
public override string Description
{
get { return this.description; }
}
|
Abstrakter Dekorierer (Erbt von Menu, da das dekorierte Objekt schlussendlich auch wieder eine Komponente ist)
C#-Code: |
public abstract class MenuDecorator : Menu
{
public override string Description {
get { return this.description; }
}
|
Konkreter Dekorierer (in diesem Fall die Hamburger, welche zum Menu gehören)
C#-Code: |
public class HamburgerDecorator : MenuDecorator
{
private Menu menu;
public HamburgerDecorator(Menu menu)
{
this.menu = menu;
}
public override string Description
{
get { return menu.Description + " + Hamburger"; }
}
public override double Preis()
{
return 2.50 + menu.Preis();
}
}
|
Verwendung der Dekorierer
C#-Code: |
static void Main(string[] args)
{
Menu menu = new Menu_1();
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("Ich möchte ein Menu_1 ohne weitere Zutaten"+
";( 11.00 )...";);
Console.WriteLine("Beschreibung : "
+ menu.Description + " / Preis : " + menu.Preis());
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Yellow;
menu = new HamburgerDecorator(menu);
Console.WriteLine("Ich möchte zu meinem" +
"bestellten Menu_1 (11.00) ein zusätzlicher" +
" Hamburger (2.50)..";);
Console.WriteLine("Beschreibung : "
+ menu.Description + " / Preis : " + menu.Preis());
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Cyan;
menu = new HamburgerDecorator(menu);
menu = new NuggetsDecorator(menu);
Console.WriteLine("Ich möchte nun zu meinem" +
" Menu_1 einen zusätzlichen Hamburger (2.50) und" +
"Chicken Nuggets (1.50)...";);
Console.WriteLine("Beschreibung : "
+ menu.Description + " / Preis : " + menu.Preis());
Console.WriteLine();
menu = new Menu_2();
menu = new PommesDecorator(menu);
menu = new NuggetsDecorator(menu);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Ich möchte nun ein neues " +
"Menu_2 (9.00) mit Pommes (3.00) und Nuggets (1.50)...";);
Console.WriteLine("Beschreibung : "
+ menu.Description + " / Preis : " + menu.Preis());
Console.WriteLine();
Console.WriteLine("Press <enter> to exit...";);</enter>
Console.ReadLine();
}
|
Das Schlussresultat der Beispielverwendung der Decorator sieht dann so aus:
Das Projekt als Download ist angehängt (=> VS05 Solution).
Weiterführende Links:
>
http://en.wikipedia.org/wiki/Decorator_pattern
>
http://exciton.cs.rice.edu/JavaResources...atorPattern.htm
>
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html
>
http://www.informit.com/articles/article...=31350&seqNum=1
>
http://www.codeproject.com/info/search.a...ecorator&sbo=kw
Schlagwörter: Decorator, Pattern, Entwurfsmuster