gpt4 book ai didi

每个用户的 c# 策略模式

转载 作者:行者123 更新时间:2023-11-30 15:28:35 26 4
gpt4 key购买 nike

我有一个非常简单的场景。我网站的用户可以是月度成员(member)或年度成员(member)

public class User
{
public string UserName { get; set; }
public MembershipType MembershipType { get; set; }
}

public enum MembershipType
{
MONTHLY,
ANNUALLY
}

然后根据成员(member)资格,我应用不同的计费策略:

public interface IBillingStrategy
{
void Bill(User user);
}

if (user.MembershipType == MembershipType.ANNUALLY)
{
_billingStrategy = new AnnualBillingStrategy();
}
else if (user.MembershipType == MembershipType.MONTHLY)
{
_billingStrategy = new MonthlyBillingStrategy();
}

这是非常直接和简单的。现在生意来了,说“我想照顾我的 friend 鲍勃,我希望你计算他的账单的方式与其他人略有不同!”

因此,如果我继续该模式,我可以制作 BobBillingStrategy。然后我可以添加一些额外的逻辑,现在我有两种方法可以识别 Bob

if (user.UserName.Equals("bob"))
{
_billingStrategy = new BobBillingStrategy();
}

这感觉很脏,因为我正在硬编码用户名,而我的运气 bob 创建了一个新用户。所以我可以向我的用户添加一个名为 IsBob 的 bool 属性

if (user.IsBob)
{
_billingStrategy = new BobBillingStrategy();
}

我觉得这两种味道都很有趣。我可以看到会发生什么,最终我将开始为 Fred 和 Ted 进行测试。我上面的代码可以工作,但我确信必须有一个更简洁的解决方案。

谢谢

最佳答案

我会将 Membership 作为一个包含默认计费等的类。它会比一堆 if 更干净:

public class Membership
{

public String Name { get; private set; }
public BillingStrategy DefaultBillingStrategy {get; private set; }
//Other properties

public Membership(string name, BillingStrategy defaultBillingStrategy)
{

Name = name;
DefaultBillingStrategy = defaultBillingStrategy;

}

}

然后,你对你的用户做这样的事情:

public class User
{

//same as before

public BillingStrategy BillingStrategy {get; set; }

public User(string Name, Membership membership, BillingStrategy billingStrategy = null)
{

name = Name;
MemberShip = memberShip;
BillingStrategy = billingStrategy ? membership.DefaultBillingStrategy;

}

}
enter code here

还有;因为如果用户在 7 月加入,他们不想为 1 月到 6 月付费,你可能想保存一些关于用户的成员(member)资格何时到期的信息,并让成员(member)在结算时/结算后设置此值

关于每个用户的 c# 策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25500997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com