2012-07-05 52 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")); 
相關問題