2009-06-01 4 views
0

Для каждого продукта есть калькуляторы стоимости, такие как: скидка, скидка от продавца, бонус от продавца, ежемесячная скидка и т. Д. В будущем будут добавлены калькуляторы стоимости.Декораторы затрат

У нас есть конкретный класс продукции и множество декораторов для каждого расчета стоимости. Все продукты должны использовать все калькуляторы, потому что калькуляторы решают применить свои расчеты по свойствам продукта, например, идентификатор продавца продукта, идентификатор категории, цвет и т. Д.

И есть миллионы продуктов в нашей системе, которые должны быть рассчитывается. Итак, мы лучше кэшируем декорированные калькуляторы. Потому что украшение каждого объекта продукта во время выполнения будет дорогостоящим. Но это сложно с рисунком декоратора. Похоже, что этот запах используется в нашей ситуации.

Что вы предлагаете? Должны ли мы использовать декораторы, стратегию или схему цепочки ответственности? Или нет.

ответ

0

Все продукты должны использовать все калькуляторов, так как калькуляторы решили применить свои расчеты на свойства продукта, как продукт идентификатор продавца, идентификатор категории, цвет и т.д.

Если вы необходимо, чтобы все продукты использовали все декораторы, тогда вы на самом деле не получаете какой-либо выгоды от шаблона. Означает ли это, что если вы реализуете новый декоратор, все существующие объекты должны быть обновлены, чтобы использовать этот новый декоратор?

Декораторы следует наносить на изделия только в случае необходимости, и должны применяться только те декораторы, которые необходимы.

Думаю, вы должны удалить решение из декораторов; что-то другое должно решить, следует ли применять декоратор, и в этом случае он обертывает продукт в соответствующие декораторы. Таким образом, вы знаете, что если продукт обернут в декоратор, этот декоратор влияет на продукт.

+0

Декораторы выполняют вычисления на основе свойств продукта, мы зацикливаемся на списке продуктов, чтобы применить эти вычисления ко всем продуктам. Итак, украшая каждый из этих продуктов на каждой итерации, мы думали, что кэширование логики расчета будет хорошей идеей. Но это трудно сделать с декораторами. Таким образом, лучший подход заключается в использовании шаблона стратегии как набора/получения продукта. Продукт p = новый продукт(); p.setCalculationStrategy (listOfCalculators); p.price(); // будет вызывать все калькуляторы, будут вычислены только интересующие калькуляторы –

+0

p.price() { return listOfCalculators.price(); } listOfCalculators.price() { каждый калькулятор делать { // .... } возврата цена; } –

3

В шаблоне стратегии изменяется цель объекта.

Поэтому я считаю, что стратегия будет хорошим выбором.