2009-11-14 2 views
4

Par exemple, supposons que j'ai une classe de produit que je peux ajouter à un panier. Je peux vouloir l'emballer ensemble avec un autre article quand il est également dans le chariot et ajouter un escompte de 15%. La classe de produit doit-elle être décorée avec une nouvelle sous-classe permettant des offres, ou faut-il redéfinir la classe de produits pour permettre au chariot d'attacher un objet «stratégie» de réduction de prix au produit, en réduisant le prix?Quand est-il approprié de créer un décorateur pour un objet, et quand est-il approprié de réécrire votre objet pour permettre l'application de stratégies?

Ceci est un exemple abstrait, alors prenez-le où vous voulez.

Répondre

3

Le décorateur est l'un des motifs les moins invasifs que vous pouvez appliquer - quand vous le faites, vous suivez le principe Ouvert/Fermé parce que votre classe originale n'est jamais modifiée. J'ai tendance à utiliser Decorator autant que possible. C'est surtout le cas lorsque la classe d'origine n'a pas besoin d'interagir avec l'extension. Injecter une stratégie est plus invasif car la classe obtenant la stratégie doit être modifiée pour accepter la stratégie (évidemment, une fois que vous avez fait cette modification, vous pouvez appliquer beaucoup de stratégies différentes sans modifier votre classe). J'utilise la stratégie lorsque la classe originale doit interagir avec la stratégie (par exemple, poser des questions sur quelque chose).

Notez que les stratégies peuvent souvent être décorés ...

+0

Vous avez utilisé un mot ici que je vais inclure dans ma réponse: "Injecter". J'ai tendance à mettre l'injection et les stratégies ensemble. J'ai tendance à penser à la décoration comme ajoutant à la fonctionnalité existante, et j'ai tendance à utiliser des décorateurs ESPECIALLY quand ma méthode child.SomeMethod() appelle 'base.SomeMethod()' –

+0

Donc, en utilisant cet exemple artificiel, vous diriez il serait plus approprié d'avoir le panier "reconnaître" l'affaire, l'emballage des produits dans le panier dans une classe de décorateur "Discounted Product"? – Zak

+0

Comme écrit, oui. En réalité, en ce qui concerne les produits et les chariots, vous voudrez probablement connaître le prix original ainsi que le prix réduit pour pouvoir déclarer le montant économisé, auquel cas l'exemple s'effondre. –

0

Il suffit de regarder votre domaine. Si c'est un produit qui permet sa réduction de prix (hm ... je ne pense pas) alors vous devriez l'ajouter au produit.

si c'est la commande (imo, le bon endroit pour faire des remises) alors il devrait être là.

+0

mais un élément de panier est pas un ordre, et devraient avoir/montrer une réduction le cas échéant .. – Zak

Questions connexes