如何在策略模式中拥有一种策略会返回不止一个价值

时间:2018-07-04 04:01:46

标签: c# design-patterns strategy-pattern

我实施了一种策略模式。其中一种策略应该返回2个值,而其他策略则返回1个值。我目前在界面方法中使用 out param ,这是因为它可用于设置该值的一种策略,并使其对所有其他策略都为空,如以下示例所示

我想知道是否有一种更好的方法可以使一个策略返回多个值,而不必让所有其他策略都处理掉该参数(即使它们都将其设置为null) 例如:

public interface IContributionStrategy
{
    decimal (decimal configuredAmt, out decimal? recurrent);
}
public class Strategy1 : IContributionStrategy
{
  public Strategy1 (int param1)
  {
    this.Param = param1;
  }
  public decimal Calculate(decimal amt, out decimal? recurrent)
  {
     recurrent = somevalue;
     //some logic that uses amt and this.Param and performs calc
     return calculatedLogic;
  }
public class Strategy2 : IContributionStrategy
{
  public decimal Calculate(decimal amt, out decimal? recurrent)
  {
     recurrent = null; //having to set this to null only because its in the Calculate() in the interface and this strategy is not using the recurrent value.
     //some logic that uses amt and performs calc
     return calculatedLogic;
  }
}

3 个答案:

答案 0 :(得分:2)

我建议同时包含两者的类。

public class CalculateResult {
    decimal amount {get;set}
    decimal? recurrent {get;set}
}

答案 1 :(得分:1)

我建议您考虑两个有力的替代签名:

(1)

IEnumerable<decimal> Calculate(decimal configuredAmt);

(2)

decimal Calculate(decimal configuredAmt, Action<decimal> extra);

您可以像这样实现这些:

(1)

public IEnumerable<decimal> Calculate(decimal amt)
{
    yield return 1m;
    yield return 42m;
    yield return 2m;
}

(2)

public decimal Calculate(decimal amt, Action<decimal> extra)
{
    extra(1m);
    extra(42m);
    return 2m;
}

第二个选项可能会这样使用:

var s = new Strategy1();
var extras = new List<decimal>();
decimal r = s.Calculate(1m, x => extras.Add(x));

结果是r == 2mextras包含1m42m

答案 2 :(得分:0)

我建议您返回包含所有必需信息作为属性的用户定义数据类型(如类,结构),而不是返回原始数据类型。

MVP