Когда уместно создать декоратор для объекта, и когда уместно переписать ваш объект, чтобы можно было применять стратегии? - PullRequest
4 голосов
/ 14 ноября 2009

Например, предположим, у меня есть класс Product, который я могу добавить в корзину. Я могу захотеть упаковать его вместе с другим товаром, когда он также есть в корзине, и добавить скидку 15%.

Должен ли товарный класс быть украшен новым подклассом, позволяющим совершать сделки, или же следует изменить класс товара, чтобы позволить корзине прикрепить к продукту объект «стратегии» снижения цены, снижающий цену?

Это абстрактный пример, поэтому возьмите его с собой.

Ответы [ 2 ]

3 голосов
/ 14 ноября 2009

Декоратор - это один из наименее инвазивных шаблонов, который вы можете применить - когда вы это делаете, вы следуете принципу Open / Closed, потому что ваш первоначальный класс никогда не изменяется. Я склонен использовать Decorator, когда это возможно. В основном это тот случай, когда исходному классу не нужно взаимодействовать с расширением.

Внедрение Стратегии является более инвазивным, потому что класс, получающий Стратегию, должен быть модифицирован для принятия Стратегии (очевидно, что после того, как вы сделали эту модификацию, вы можете применять множество различных Стратегий без дальнейшей модификации вашего класса). Я использую Стратегию, когда исходный класс должен взаимодействовать со Стратегией (например, спросить ее о чем-либо).

Обратите внимание, что стратегии часто могут быть украшены ...

0 голосов
/ 14 ноября 2009

просто посмотрите на свой домен.

если это продукт, который позволяет снизить цену (хм ... я так не думаю), то вы должны добавить его в продукт. если это заказ (имо, правильное место для скидок), то он должен быть там.

...