Laden...

Frage zu Decoratormuster

Erstellt von serial vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.338 Views
s
serial Themenstarter:in
902 Beiträge seit 2007
vor 15 Jahren
Frage zu Decoratormuster

Hallo,

erstmal ein gesundes neues Jahr euch allen!

So nun miene Frage; ich arbeite gerade das Buch "Entwurfsmuster von Kopf bis Fuss" durch, und stelle mir beim Decoratormuster eine Frage!

Da ist es ja so, das jeder Dekorator ein Feld von der Superklasse hat und selber von dieser Erbt! (Damit der Dekorator das gesamte Objekt repräsentiert)

Und angewandt wird er da folgendermaßen:


Getränk getr = new Getränk();   //normales getränk

getr = new Schoko(getr); // schoko hinzufügen
getr = new Milch(getr); //und extra milch


meine frage ist, da mir das ganze new nicht gefällt, folgende:

Kann man der Superklasse nicht eine Liste von der Superklasse geben, und eine Addmethode, wo dann neue INstanzen einer abgeleiteten Klasse hinzugefügt werden, sodass man dieses ganze new nicht mehr braucht?

s
serial Themenstarter:in
902 Beiträge seit 2007
vor 15 Jahren

ok, antwort glaube ich selbst gefunden!

Das könnte man vielleicht machen, wenn man den code der superklasse hat, sonst geht das ntürlich nicht! (wenn man klassen von 3ten dekorieren möchte)

s
serial Themenstarter:in
902 Beiträge seit 2007
vor 15 Jahren

ok, ganz ist die frage für mich trotzdem noch nicht geklärt!

Wie sollte ich denn vorgehen, wenn ich den gesamten code entwickel?

Und eben so eine Art wie das mit dem Kaffee mache?(Also ein Hauptprodukt welches mit mehreren kleinen Sachen kompiniert werden kann)

Soll ich da auch das Dekoratormuster verwenden?
Oder dem Hauptprodukt eine Liste mitgeben, wo alle Dekoratoren (eigene Klassen welche eine gemeinsame Schnittstelle implementieren) gespeichert werden, und bei zB einer Preosberechnung durhc die Liste iteriert wird, und eben die gewünschte Methode des aktuellen Objekts in der Liste aufrufe?

Irgendwie ist mir das einsatzgebiet des dekorators wohl noch nicht klar, vielleicht kann mir jemand auf die sprünge helfen?!

2.187 Beiträge seit 2005
vor 15 Jahren

Hi,

Ich könnte dir ein weiteres Beispiel geben, das mehr Technikorientiert ist.

Warum das dekorierte Objekt nicht "einfach" eine Liste enthält erklärt sich dadurch, das dann das dekorierende Objekt nicht selbst dekoriert werden kann! Mit dem Pattern lassen sich Dekorirer halt wieder selbst dekorieren:
new Milchschaum(new Raspeln(new Kaffee()));

Gruß
Juy Juka

s
serial Themenstarter:in
902 Beiträge seit 2007
vor 15 Jahren

ok, das ist klar, aber was ist bei Entwürfen, wo es keinen sinn ergibt das die dekorierer selbst dekoriert werden?

(Wer bestellt schon nur schaum mit raspeln?)

EDIT: für technischere umsetzungen oder beispiele würde ich mich schon sehr freuen!

s
8.746 Beiträge seit 2005
vor 15 Jahren

Hier mal ein paar Beispiele, wie .NET die GOF-Patterns einsetzt:

http://msdn.microsoft.com/msdnmag/issues/05/07/DesignPatterns/default.aspx

Motivation für das Anwenden der Dekorierers ist eine möglichst einfache Vererbungshierarchie. Oder anders formuliert: Wenn es schwer fällt verschiedene Aspekte einer Funktionalität (bezogen auf Stream: Verschlüsselt, gepuffert, etc.) mit orthogonalen Funktionen (File, Speicher, etc.) gescheit in eine Hierarchie zu pressen (Dopplungen sind imemr ein Zeichen für das Problem), hilft der Dekorierer weiter. Man kann so eine Art "Pipelining" von Funktionalität erreichen.

Alternativ kann man oft auch das Strategie-Muster verwenden.

Leider sind die meisten Pattern-Bücher wenig problemorientiert und daher für Einsteiger in meinen Augen ungeeignet. Man muss immer erst (Design-) Probleme zeigen um den Vorteile bestimmter Patterns zu verstehen.

Das Milch-Zutaten-Beispiel scheint auf den ersten Blick zwar sehr gut zu passen, ist aber m.E. als Lehrbeispiel schlecht geeignet, weil man intuitiv zur Komposition als Vererbungsersatz neigt (eben: Niemand bestellt einen Kaffee und Schaum mit Raspeln, sondern einen Kaffee mit Schaum UND Raspeln). Bestellvorgänge sind zudem gänzlich ungeeignet für strukturelle Patterns, weil diese "gleichzeitig" ablaufen (man muss beim Deokorierer alle Zutaten auf einmal bestellen). Die Komposition erfordert das nicht und ist daher wirklich das bessere Pattern für diesen Anwendungsfall.

Streams passen wieder die Faust aus Auge.

2.187 Beiträge seit 2005
vor 15 Jahren

Hi,

Hier mal mein technisches Beispiel:
Wir wollen das zusammenstellen von SQL-SELECT-Befehlen in Klassen kapseln.
Dazu haben wir eine Select-Klasse (SELECT * FROM [] ) und diese Select-Klasse verfügt über ein Property/eine Assoziation zur Bedingung-Klasse ( [Spalte]='[Value]' ).
Die Bedingung-Klasse ist der zu dekorierende Typ und es gibt verschiedene Dekorierer:

  • NotBedinung
  • ZusammengesetzteBedingung
  • SubSelectBedingung

Gruß
Juy Juka

[EDIT]Diagramm vergessen[/EDIT]

s
serial Themenstarter:in
902 Beiträge seit 2007
vor 15 Jahren

kannst du mir auch mal ein anwendungsbeispiel geben?
Ich habe wohl wieder mal ein brett vorm kopf 😠

915 Beiträge seit 2006
vor 15 Jahren


new Bedingung(new ZusammengesetzteVerbindung[]{new ZusammengesetzteVerbindung(new Select("MyTable").ToSQL() + new PropertieBedingung("MyColumn").ToSql() + new Operationen().Gleich + "Value"), new ZusammengesetzteVerbindung(new Select("MyTable1").ToSQL() + new PropertieBedingung("MyColumn1").ToSql() + new Operationen().Gleich + "Value1")}).ToSql()

Mal sehen ob ichs richtig verstanden habe .. achja Tippfehler usw. sind garantiert!

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

2.187 Beiträge seit 2005
vor 15 Jahren

@Andreas.May: Fast 😁


// Ist alles nur vereinfachter Beispielcode.
Select selectFürArtikel = new Select("Artikel");   
// SELECT * FROM [] WHERE 1=1 AND []
Bedingung bedinungFürArtikel =
  new ZusammengesetzteBedingung(Verbinder.And, 
// ( [] AND [] )
    new Bedingung("Name",Operationen.Gleich,"meinArtikel"), 
// Name='meinArtikel'
    new Bedingung("LoeschZeichen",Operationen.Ungleich,"geloescht") 
// LoeschZeichen = 'geloescht'
    );
selectFürArtikel .Bedingung = bedinungFürArtikel ;

915 Beiträge seit 2006
vor 15 Jahren

Von sowas bekommt man nachts Alpträume😉

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

2.187 Beiträge seit 2005
vor 15 Jahren

Oder einen ******* (≤ Perverser Ausdruck für die mänliche Errektion. )

s
serial Themenstarter:in
902 Beiträge seit 2007
vor 15 Jahren

hm...lol!