3

我正在尝试实施策略模式。这是我的实现的一部分:

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

现在每次我调用这个函数时我都必须写:

var employees = GetOrderedEmployeeNames(new OrderByFamilyName());

每次都以正确的方式“更新”策略还是我执行不正确?

4

3 回答 3

7

如果实现的类IOrderByStrategy没有任何状态(即每次都表现相同),那么您不妨将其存储在某个字段中,以节省重新编写new它的时间。

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

于 2012-07-05T18:55:28.267 回答
3

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

一些替代方案:

  • 实现一个StrategyFactory创建新实例或保存对flyweights(由某个键索引的小对象,如字符串)的引用
  • 将策略实现为单例,但如果有很多策略,这可能会比您需要的开销更大。
于 2012-07-05T18:57:45.333 回答
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"));
于 2012-07-05T19:24:58.807 回答