2013-10-24 93 views
1

目前,我有一個標準的策略模式實現,簡化:策略模式替代實現

public interface IStrategy 
{ 
    IList<Dog> GetDogs(); 

} 

public class DogStrategy: IStrategy 
{ 
    public IList<Dog> GetDogs() 
    { 
     return new List<Dog>(); 
    } 
} 

我也有一個使用策略AA級:

public class DogCollection 
{ 
    private IStrategy strategy; 
    public IStrategy Strategy 
    { 
     get { return strategy; } 
     set 
     { 
      if (strategy == null || value.GetType() != strategy.GetType()) 
      { 
       strategy = value; 
       //do stuff 
      } 
     } 
    } 

問題:什麼我發現在2個地方實施了這種模式,接口開始擴散一點。這是可管理和靈活的,但我知道同事會因文件太多而感到不安 - 他們不喜歡設計模式。此外,我需要使用策略的一些共同邏輯,以便集合需要有一個它繼承的抽象類。

我想,而不是使用所有這些接口讓DogCollection從包含額外的邏輯泛型集合繼承:

public class DogCollection : GenericCollection<Dog> 

我可以使用Loader屬性,而不是一個IStrategy財產。然後,我可以刪除這兩種策略模式的各種文件:

public abstract class GenericCollection<T> 
{ 
    private Func<IList<T>> loader; 
    public Func<IList<T>> Loader 
    { 
     get { return loader; } 
     set 
     { 
      loader = value; 
      //do stuff 
     } 
    } 
} 

而是通過各種條件instatitiating具體戰略的實施,並在DogCollection制定戰略制定戰略的,我只想創建包含程序,以獲取靜態類不同的狗並分配裝載機屬性。然後可以使用加載器屬性在請求時返回列表。

哪個是首選?爲什麼?

回答

2

這仍然是戰略模式。

請注意,設計模式通常用於克服您使用的編程語言中的缺陷。

在C#函數中幾乎所謂的第一類公民通過使用委託類型,並且實際上不需要將您的策略​​包裝到接口和類中。

效果基本相同,我寧願使用第二種方法使用代理:更少的代碼,更少的接口,更少的類,更少的文件,更少的混淆。

+0

我同意,我現在正在刪除大量代碼。羞愧戰略模式的每個例子都使用舊式界面方法。順便說一句,我曾說過替代實施,而不是替代模式。 –