实施战略模式。我每次都要“新手”吗?

时间:2012-07-05 18:52:59

标签: c# strategy-pattern

我正在尝试实施strategy pattern.这是我实施的一部分:

public List<string> GetOrderedEmployeeNames(IOrderByStrategy strategy)
{
   return GetEmployeeFullNames().OrderBy(strategy.Order);
}

现在每次我调用这个函数我都要写:

var employees = GetOrderedEmployeeNames(new OrderByFamilyName());

每次正确的方式是“新手”策略还是我不正确地实施这个策略?

3 个答案:

答案 0 :(得分:7)

如果实现IOrderByStrategy的类没有任何状态(即每次都表现相同),那么你也可以将它存储在某个地方,以节省重新new

那就是说,new是一个非常有效的操作,如果你没有在一个紧凑的循环中调用它,那么继续做你正在做的事情可能会更简单。

答案 1 :(得分:3)

不一定,虽然它可能不会伤害创建对象的任何东西,因为我假设它们主要是方法并且不包含大量数据。

一些替代方案:

  • 实现StrategyFactory创建新实例或保存对flyweights的引用(由某个键索引的小对象,如字符串)
  • 将策略实施为单身,但如果有很多策略,这可能比您需要的开销更多。

答案 2 :(得分:1)

如果策略具有相同的行为,您可以存储属性。如果没有,您可以使用参数创建对象。

    private IOrderByStrategy orderByStrategy;
    public IOrderByStrategy OrderByStrategy
    {
         get
         {
            if(orderByStrategy != null)
               return orderByStrategy;
            else
               return new OrderByStrategy();
         }
    }
var employees = GetOrderedEmployeeNames(OrderByStrategy);

第二种情况:

var employees = GetOrderedEmployeeNames(new OrderByFamilyName("familyname","DESC"));