为了结束,我想我会用我的努力的结果来更新帖子,尽管我对 Brandon 和 Florian 的答案表示赞赏,因为他们让我走上了正确的道路。
正如 Brandon 建议的那样,我最终得到了一个名为 IHaveRecurrence 的接口,定义如下:
public interface IHaveRecurrence
{
DateTime? LastOccurrence { get; }
RecurrenceType RecurrenceType { get; }
Int32 RecurrenceValue { get; }
Boolean IsDue();
}
我的 MaintainableTool(基)类现在实现了这个接口。IsDue 方法是通过委托给 Recurrence 类来实现的:
public Boolean IsDue()
{
return Recurrence.IsDue(this);
}
Recurrence 是 Florian 建议的抽象基类。我有几个子类,例如 DailyRecurrence、WeeklyRecurrence 等。每个子类都对应于 RecurrenceType 枚举中的一个值,并实现适当的逻辑,以通过 IHaveRecurrence 接口根据 RecurrenceValue 和 LastOccurrence 属性确定 PM 是否到期。
Recurrence 使用内部 RecurrenceFactory 类来解析使用哪个子类:
internal sealed class RecurrenceFactory
{
public Recurrence GetRecurrence(RecurrenceType type)
{
switch (type)
{
case Daily: return new DailyRecurrence;
:
}
}
}
并且 Recurrence 实现为:
public abstract class Recurrence : IDisposable
{
public static Boolean IsDue(IHaveRecurrence recurringObj)
{
using (var recurrence = RecurrenceFactory.GetRecurrence(recurringObj.RecurrenceType))
{
return recurrence.GetIsDue(recurringObj);
}
}
protected abstract Boolean GetIsDue(IHaveRecurrence recurringObj);
}
然后,例如, DailyRecurrence 类实现为:
public sealed class DailyRecurrence : Recurrence
{
protected override Boolean GetIsDue(IHaveRecurrence recurringObj)
{
if (recurringObj.LastOccurred.HasValue)
return recurringObj.LastOccurred.AddDays(recurringObj.RecurrenceValue) <= DateTime.Now;
return true;
}
}
我喜欢这个模型,因为它具有高度可扩展性,封装了解决每个重复模式所需的逻辑并保持我的业务对象干净。