Wann und wie kann ein Strategie-Muster anstelle eines Dekorator-Musters angewendet werden?

7

Ich lerne Designmuster und versuche, Go4 Buch zu folgen. Auf Seite: 179 gibt es in dem Decorator-Musterkapitel eine Zeile, die

sagt
  

".. indem Sie die Anzahl der Strategien von nur einer auf eine erweitern   Open-ended-Liste erreichen wir den gleichen Effekt wie die Verschachtelung von Dekoratoren   rekursiv. "

Ich habe diese Aussage nicht ganz verstanden.

Strategien konzentrieren sich auf unabhängige Algorithmen, die dynamisch eingestellt werden können und nicht viel über den Client wissen, in dem sie eingestellt sind.

Während Dekorateure nicht ganz unabhängig von den Kunden sind, die sie dekorieren. Tatsächlich haben sie denselben Obertyp wie das Objekt, das sie dekorieren.

Verpasse ich hier einen Punkt?

    
Sandbox 04.12.2010, 16:52
quelle

5 Antworten

14

Ich zitiere ein wenig mehr von dem Kontext, der meiner Meinung nach notwendig ist, damit dies Sinn ergibt.

  

Strategien sind eine bessere Wahl in Situationen, in denen die Komponentenklasse von Natur aus schwergewichtig ist, wodurch das Decorator-Muster zu kostspielig wird. Im Strategie-Pattern leitet die Komponente einen Teil ihres Verhaltens an ein separates Strategieobjekt weiter. Mit dem Strategie-Muster können wir die Funktionalität der Komponente ändern oder erweitern, indem wir das Strategieobjekt ersetzen.

     

Beispielsweise können wir verschiedene Rahmenarten unterstützen, indem die Komponente die Rahmenzeichnung auf ein separates Rahmenobjekt verschiebt. Das Border-Objekt ist ein Strategy-Objekt, das eine Randzeichnungsstrategie enthält. Indem wir die Anzahl der Strategien von nur einer auf eine offene Liste erweitern, erzielen wir den gleichen Effekt wie die rekursive Verschachtelung von Dekoratoren.

Dies bedeutet, dass beide Muster verwendet werden können, um Ihrer Basiskomponente ein Verhalten hinzuzufügen. Mit Decorator können Sie mehrere Decorators hinzufügen, während Sie bei Strategie mehrere Strategien verwenden müssen.

Sie haben Recht, dass Strategien im Allgemeinen unabhängiger von der Hauptkomponente sind als Dekoratoren, aber es ist ihnen möglich, sich der Komponente bewusst zu sein. Und um das Strategie-Muster zu verwenden, ist sich die Hauptkomponente der Existenz von Strategien bewusst, wo dies bei Decorator nicht benötigt wird.

    
Don Roby 04.12.2010, 17:42
quelle
6

Um ihr Beispiel zu verwenden, haben Sie möglicherweise eine Fensterklasse, die gescrollt werden kann und / oder deren Rand auf verschiedene Arten (oder gar nicht) gemalt werden kann. Wenn Sie Vererbung verwenden würden, um alle diese Features abzudecken, benötigen Sie eine Unterklasse für jede mögliche Kombination von Features (kein Rahmen ohne Scrollen, Rahmen ohne Scrollen, Scrollen ohne Rahmen, Rahmen und Scrollen usw.). Dies ist ein unflexibler Wartungsalarm, da Sie mehr Funktionen hinzufügen, da die Anzahl der Klassen explosionsartig ansteigt.

Der Hauptpunkt, den Sie hier machen, ist, dass Sie entweder das Strategie-Muster oder das Decorator-Muster verwenden können, um dieses Problem besser zu lösen. Sie könnten eine Window-Klasse haben, die ein scrollendes Strategieobjekt und ein Border-Strategieobjekt kapselt. Oder Sie können Ihr Window-Objekt verwenden, es in einen Rahmen-Decorator wickeln und in einen Scroll-Dekorator einbinden.

Aber Sie haben vollkommen Recht in Ihrem Verständnis; Dies sind zwei unterschiedliche Designmuster mit unterschiedlichen Eigenschaften, die zu unterschiedlichen Anwendungen führen. Mit Decorator hat die Komponente keine Kenntnis von dem Agenten, der Funktionalität hinzufügt ... und so neigt man dazu, sich um eine vorhandene Komponentenklasse herum aufzubauen. Bei der Strategie ist es umgekehrt, da die Komponente Agenten verwendet (und somit auch weiß), verschiedene Aufgaben auszuführen - diese Agenten wissen im Allgemeinen nichts über ihre bestimmenden Komponenten.

    
Nathan Pitman 04.12.2010 17:30
quelle
1

Wenn Sie mehrere Ansätze für etwas verwenden möchten, verwenden Sie ein Strategie-Muster. Wenn Sie etwas erstellen möchten, bei dem bestimmte Dinge möglicherweise zum Ändern eines Objekts / einer Komponente / was auch immer verwendet werden, sollten Sie einen Dekorateur verwenden. Mit anderen Worten, es kann auch gesagt werden, dass ein Decorator wahrscheinlich ein Objekt mit Funktionalität (dekorieren) erweitert und eine Strategie wahrscheinlich die Funktionalität vertauscht.

    
user1808932 11.06.2013 13:15
quelle
0

Der Unterschied besteht darin, dass im Strategie-Muster ein Strategieobjekt verwendet werden kann, um dem Kontext gleichzeitig Informationen zu liefern. Mit Decorator können Sie Strategien übereinander stapeln und haben so etwas, was sie als "offene" Zahlen bezeichnen.

    
Mike 04.12.2010 17:37
quelle
0

Das Strategie-Muster kann angewendet werden, wenn die Identität des Objekts für Sie wichtig ist. Die Objektidentität bleibt unabhängig davon, wie viele Strategien angewendet werden, jedoch für das Decorator-Muster Objekte sind ineinander eingekapselt, die ursprüngliche Identität geht bei der Transformation verloren

  • Dekoratormuster ändert die Skin eines Objekts

  • Das Strategie-Muster ändert die Eingeweide eines Objekts.

mixturez 17.04.2013 11:19
quelle