Здесь кратко изложены бизнес-требования.
У меня есть объект PricingSchedule, представляющий «подписку» на систему.Мы используем термин «График ценообразования», а не «подписка» на вездесущем языке нашей команды, но теоретически подписка - это одно и то же.
То, что определяет Цену PricingSchedule, является комбинацией двух вещей:1. «продолжительность» PricingSchedule (или сколько времени ваша подписка ... 1 год, 2 года и т. Д.) 2. сколько стилей (другой объект) вы хотите включить в свой PricingSchedule. У вас есть дваварианты включения стилей: 1. оплата за стиль, 2. оплата за все стили
Число 2 - это новое добавленное требование. Раньше именно PricingSchedule определяла продолжительность, определяющую цену.
Моя проблема в том, что ... цена PricingSchedule ничего не значит, когда либо Duration, либо StylePricingType применяются сами по себе. Я могу получить окончательную цену только тогда, когда они объединены вместе, то есть, продолжительность 2 годас 5 стилями.
У нас есть четыре возможных предопределенных продолжительности, от пары дней до 3 или 4лет.
У нас есть два возможных способа выставить счет на выбор стиля;1. за стиль или 2. все стили.Эти две вещи объединились, а затем определили общую цену.
Я начал думать, что шаблон проектирования стратегии может помочь мне здесь, иначе;
public interface IDurationPricingStrategy
public decimal GetDurationPriceFor(PricingSchedule)
public interface IStylePricingStrategy
public decimal GetStylePriceFor(PricingSchedule)
Это хороший способ отделить вещи, которые, вероятно,изменения идут вперед, но в этом и заключается загвоздка;Я не могу реализовать одну Стратегию, не зная «условных условий» другой Стратегии.
Например, для IStylePricingStrategy я реализую опцию ценообразования с неограниченным стилем следующим образом:
public class UnlimitedStylePricingStrategy : IStylePricingStrategy
{
public decimal GetStylePriceFor(PricingSchedule)
{
if (PricingSchedule.Duration.Type == DurationType.OneYear)
{
return decimal x;
}
if (PricingSchedule.Duration.Type == DurationType.TwoYears)
{
return decimal x;
}
}
}
, если япринять этот подход, это означает, что если и когда мне придется добавить или изменить тип ценообразования Duration, то я должен изменить свой класс реализации StyleStrategy, который нарушает SRP и в основном возвращает меня на круги своя.
Этолегко, если есть только одна «вещь», которая определяет цену для PricingSchedule, но когда у меня есть две такие вещи, вот где я бью стену.
Есть ли другой шаблон, который я могу использовать, иликаким-то образом использовать шаблон стратегии по-другому?Я чувствую, что проблема все еще тянет меня к Стратегии, но я не уверен, как объединить две Стратегии вместо одной.
Большое спасибо!Mike