我有一个非常简单的场景。我网站的用户可以是月度会员或年度会员
public class User
{
public string UserName { get; set; }
public MembershipType MembershipType { get; set; }
}
public enum MembershipType
{
MONTHLY,
ANNUALLY
}
然后根据会员资格,我采用不同的计费策略:
public interface IBillingStrategy
{
void Bill(User user);
}
if (user.MembershipType == MembershipType.ANNUALLY)
{
_billingStrategy = new AnnualBillingStrategy();
}
else if (user.MembershipType == MembershipType.MONTHLY)
{
_billingStrategy = new MonthlyBillingStrategy();
}
这是非常直接和简单的。现在生意来了,说“我想照顾我的朋友鲍勃,我希望你计算他的账单与其他人略有不同!”
所以如果我继续这个模式,我可以制作一个 BobBillingStrategy。然后我可以添加一些额外的逻辑,现在我有两种方法可以识别 Bob
if (user.UserName.Equals("bob"))
{
_billingStrategy = new BobBillingStrategy();
}
这感觉很脏,因为我正在对用户名进行硬编码,而我的运气 bob 创建了一个新用户。所以我可以向我的用户添加一个名为 IsBob 的布尔属性
if (user.IsBob)
{
_billingStrategy = new BobBillingStrategy();
}
对我来说,两者都闻起来很有趣。我可以看到会发生什么,最终我将开始为 Fred 和 Ted 进行测试。我上面的代码可以工作,但我确信必须有一个更清洁的解决方案。
谢谢