我有以及接口和实现如下。 如果一个数字可以被devisor整除,它将显示名为" Divisible"的内容。 现在新的增强功能出现在我需要根据时间更改文本的地方。 如果数字是可分的并且时间是12:00 PM,则显示" Divisible ***"。如果时间不是" 12:PM"显示旧值i:e" Divisible"。 我知道可以做到,但条件是我们不应该违反SOLID原则。我所做的设计是错的吗?请建议。
public interface IRule
{
string GetResult(int number);
}
public class DivisibleRule : IRule
{
private readonly int divisor;
private readonly string contentToDisplay;
private readonly string replacementContent;
public DivisibleRule(int divisor, string contentToDisplay)
{
this.divisor = divisor;
this.contentToDisplay = contentToDisplay;
}
/// <summary>
/// Gets the result.
/// </summary>
/// <param name="input">The input.</param>
/// <returns>Returns the content if divisible.</returns>
public string GetResult(int input)
{
return input % this.divisor == 0
? this.contentToDisplay
: string.Empty;
}
}
答案 0 :(得分:2)
如果要在不修改现有代码的情况下添加此功能(基本上是Open/closed principle的内容),那么您可以添加一个decorator,它将新的条件逻辑应用于已经返回的结果现有DivisibleRule
。然后,只要合适,您就可以使用装饰师装饰的DivisibleRule
。
这个装饰器看起来像这样:
public class RuleTimeDecorator : IRule
{
private readonly IRule _decoratedRule;
public RuleTimeDecorator(IRule decoratedRule)
{
_decoratedRule = decoratedRule;
}
public string GetResult(int input)
{
var result = _decoratedRule.GetResult(input);
return IsMidnight()? $"{result} ***" : result;
}
private bool IsMidnight() => //here goes the code to check if current time meets criteria
}
很好的是,这个装饰器可用于装饰IRule
的任何其他植入(只要它在你的域中产生感觉)。
BTW我正在使用一些C#6功能,如字符串插值和表达身体的成员,但这不是必需的。