这里简要介绍一下业务需求。
我有一个名为PricingSchedule的实体,它代表系统的“订阅”。我们在团队无处不在的语言中使用术语“定价时间表”而不是“订阅”,但从理论上讲,订阅也是一样的。
什么决定了PricingSchedule的价格是两件事的结合: 1. PricingSchedule的“持续时间”(又名,您的订阅有多长... 1年,2年等... 2.您希望在PricingSchedule中包含多少样式(另一个实体)。您有两种选择如何包含样式; 1.按风格付费,2。支付所有风格
第二个是新增的要求。之前,主要是PricingSchedule的持续时间确定了价格。
我的问题是......当Duration或StylePricingType本身应用时,PriceSchedule的价格并不意味着什么。我只能在他们合并在一起时得到最终的价格;又名,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;
}
}
}
如果我采用这种方法,这意味着如果我必须添加或更改持续时间定价类型,那么我必须更改我的StyleStrategy实现类,这会破坏SRP,并且基本上让我回到原点。
如果只有一个“东西”决定了PriceSchedule的价格,那就很容易了,但是当我有两件这样的东西时,那就是我撞墙的地方。
我可以使用其他模式,还是以某种方式使用策略模式?我觉得问题仍然让我陷入战略,但我不确定如何合并两个策略而不是一个。
非常感谢! 麦克
答案 0 :(得分:1)
我认为一种方法可能是在一段时间内创建一个界面:
public interface IDuration
{
int GetDuration();
decimal CalculatePrice(object whatever); // int something, or whatever.
}
让您的日程安排课使用它:
public class PricingSchedule
{
public IDuration Duration { get; set; }
}
然后您的付款方式类可以使用如下持续时间:
public class UnlimitedStylePricingStyle : PricingStyle
{
public override void GetStylePriceFor(PricingSchedule schedule)
{
int duration = schedule.Duration.GetDuration();
//.....
}
}
棘手的是天,我不知道你会怎么处理,但我认为使用界面是你最好的选择。如果您需要添加新的持续时间,只需实现界面IDuration
。
然后您可以通过以下方式计算价格:
public override void GetStylePriceFor(PricingSchedule schedule)
{
int duration = schedule.Duration.GetDuration();
int temp = 34;
decimal result = schedule.Duration.CalculatePrice(temp);
}
希望这能给你一个粗略的想法。