2012-07-05 54 views
3

我想实现的strategy pattern.这是我实现的一部分:我每次调用这个函数时我必须写现在实施战略模式。我每次都必须“新”吗?

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

var employees = GetOrderedEmployeeNames(new OrderByFamilyName()); 

是“新-ING向上”的战略每一次正确的方式还是我实施这个不正确?

回答

3

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

一些替代方案:

  • 实现一个StrategyFactory,要么创建新实例或持有(,由一些关键索引的小物件如字符串)飞锤引用
  • 执行这些战略为单身,但如果有很多策略,这可能会比你需要的开销更多。
+0

啊,他们只是表达>的 – 2012-07-05 19:04:46

7

如果实现IOrderByStrategy没有任何状态的类(即每次都相同的行为),那么你不妨将其存储在现场的地方,省去重新new它。

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

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")); 
相关问题