我有一张课程券:
public abstract class Voucher
{
public int Id { get; set; }
public decimal Value { get; protected set; }
public const string SuccessMessage = "Applied";
}
和一个子类的GiftVoucher
public class GiftVoucher : Voucher
{
}
和另一个子类DiscountVoucher
public class DiscountVoucher : Voucher
{
public decimal Threshold { get; private set; }
public string FailureMessage { get { return "Please spend £{0} to use this discount"; } }
}
您可以看到DiscountVoucher具有两个特定的属性Threshold和FailureMessage,分别表示您需要花费多少钱才能获得折扣,以及显示失败消息(如果用户没有花费,则显示失败消息)。
我的问题是这个。我有一个Voucher对象的集合,我不想在代码中做的就是这样
if (voucher is DiscountVoucher)
{
// cast voucher to a DiscountVoucher and then call the specific methods on it
}
因为这根本无法维持。同时,我不想将那些特定的方法放在Voucher抽象类中,因为它们不适用于所有类型的Vouchers。有谁知道如何设计此功能?
最佳答案
好吧,您在这里获得的是该策略模式的一个版本。我认为最终不必决定是否拥有一种凭证类型还是可以使用的,但您可以限制变化的数量(如果可以的话,可以选择凭证类别)。
例如,您可能最终得到五个凭证,这些凭证实现了称为“ StandardVoucher”的接口和三个称为“ DiscountVoucher”的接口,但是现在不必处理八个案例,而只需两个。
这些界面可以覆盖显示可用方法的一系列凭证,而无需担心每个凭证实现的细节。