2009-06-01 12 views
0

Für jedes Produkt gibt es zugehörige Kostenrechner wie: Rabatt, Händlerrabatt, Händlerbonus, Monatsrabatt etc. In Zukunft würden weitere Kostenrechner hinzukommen.Preisausstatter

Wir haben eine konkrete Produktklasse und viele Dekoratoren für jede Kostenkalkulation. Alle Produkte sollten alle Rechner verwenden, da die Rechner ihre Berechnungen nach Produkteigenschaften wie Produkt-ID, Kategorie-ID, Farbe usw. vornehmen.

Und es gibt Millionen von Produkten in unserem System, die es sein müssen berechnet. Also, wir speichern besser die dekorierten Rechner. Denn das Verzieren jeder Produkteinheit zur Laufzeit wäre teuer. Aber das ist hart mit Decorator-Muster. Es scheint wie ein Geruch, dieses Muster in unserer Situation zu benutzen.

Was schlagen Sie vor? Sollten wir Dekoratoren, Strategien oder Verantwortungsmuster verwenden? Oder kein Muster.

Antwort

0

Alle Produkte sollten alle der Rechner verwenden, da die Rechner entscheiden, ihre Berechnungen Eigenschaften des durch das Produkt anzuwenden wie Produkt Händler-ID, Kategorie-ID, Farbe etc.

Wenn Sie müssen alle Produkte alle Dekorateure verwenden, dann profitieren Sie nicht wirklich von dem Muster. Bedeutet dies, dass, wenn Sie einen neuen Decorator implementieren, alle vorhandenen Entitäten aktualisiert werden müssen, um diesen neuen Decorator zu verwenden?

Dekorateure sollten nur bei Bedarf auf Produkte aufgetragen werden, und nur die Dekoratoren, die benötigt werden, sollten angewendet werden.

Ich denke, Sie sollten die Entscheidung aus den Dekorateuren entfernen; etwas anderes sollte entscheiden, ob ein Decorator angebracht wird, in welchem ​​Fall es das Produkt in die entsprechenden Dekorateure einwickelt. Auf diese Weise wissen Sie, dass, wenn ein Produkt in einen Dekorateur gewickelt wird, dieser Dekorator das Produkt beeinflusst (bewirkt?).

+0

Dekorierer berechnen basierend auf Produkteigenschaften, wir führen eine Liste von Produkten durch, um diese Berechnungen auf alle Produkte anzuwenden. Daher dachten wir, dass jedes Caching der Berechnungslogik eine gute Idee wäre, jedes dieser Produkte bei jeder Iteration zu dekorieren. Aber das ist schwer mit Dekorateuren zu tun. Ein besserer Ansatz wäre also, das Strategie-Pattern als Set/Get-On-Produkt zu verwenden. Produkt p = neues Produkt(); p.setCalculationStrategy (listOfCalculator); p.price(); // ruft alle Rechner auf, nur die interessierten Rechner berechnen –

+0

p.price() { return listOfCalculators.price(); } listOfCalculators.price() { jeder Rechner tun { // .... } return Preis; } –

3

In einem Strategie-Muster ändert sich die Absicht des Objekts.

Daher denke ich, Strategie wäre eine gute Wahl.