2013-02-25 194 views
2

我想在C++中實現策略模式,但我有疑問。 Alwyas的策略模式示例比遵循代碼(在C#中)。我想修改客戶端,即MainClass,這樣選擇具體的策略將是動態的。 例如,通過main方法的args []參數傳遞策略名稱。我將如何在不修改這種模式的屬性的情況下實現這一點?策略模式C++

namespace StrategyPatterns 
{ 
    // Interface definition for a Sort algorithm 
    public interface ISort 
    { 
    void Sort(List<string> list) 
    } 

    // QuickSort implementation 
    public class CQuickSorter : ISort 
    { 
    void Sort(List<string> list) 
    { 
     // Here will come the actual imp 
    } 
    } 

    // BubbleSort 
    public class CBubbleSort : ISort 
    { 
    void Sort(List<string> list) 
    { 
     // The actual imp of the sort 
    } 
    } 

    public class Context 
    { 
    private ISort sorter; 

    public Context(ISort sorter) 
    { 
    // We pass the context the strategy to use 
    this.sorter = sorter; 
    } 

public ISort Sorter 
{ 
    get{return sorter;) 
} 
} 

public class MainClass 
{ 
    static void Main() 
    { 
     List<string> myList = new List<string>(); 

     myList.Add("Hello world"); 
     myList.Add("Another item"); 

     Contexto cn = new Contexto(new CQuickSorter()); 
     cn.Sorter.Sort(myList); 
     cn = new Contexto(new CBubbleSort()); 
     cn.Sorter.Sort(myList); 
    } 
    } 
} 
+0

這應該是哪種語言?至少1個拼寫錯誤和幾個語法錯誤..看起來更像C#? – 2013-02-25 02:08:14

+0

作爲@KarthikT答案,你不能直接從C++中的字符串做到這一點,他的答案是一種方法。 「依賴注入」可能是一個很好的搜索術語,用於以各種方式查看用於執行此類事件的框架(包括一些動態的)。 – 2013-02-25 02:10:52

回答

1

我們並沒有反映在C++中,這是你需要得到這個工作的權利..我能想到的替代方案,就是讓下面一個工廠方法的概念..

ISort* CreateSorter(SortType type) 
{ 
    switch (type){ 
    case QUICK_SORT: return new CQuickSorter(); 
    ... 
    } 
} 

我使用enum獲得更清晰的代碼,但只要您能夠理解我的基本觀點,就可以將其更改爲字符串。

+0

希望反射使它成爲C++ 14:http://root.cern .ch/drupal/content/c14 – Carl 2013-02-25 02:14:47

+0

@carleeto這是我第一次看到它,但我認爲它有如*的聲明。接下來的兩個標準計劃在2014年和2017年,2014年有點像2003年:主要是bug修復和可用性改進。*反射將在C++ 17中發佈。 – 2013-02-25 02:25:29

0

我會給上下文類一個模板化的工廠功能setSorter並在內部處理分揀機對象的整個生命週期。

class Interface { //this class and all sorting clases could be templated to be able to deal with sorting lists of different data types 
    std::unique_ptr<ISort> sorter_; 
public: 
    Interface():sorter_(new CQuickSorter()){ //CQuickSorter is the default sorter 
    } 
    template<typename T> 
    setSorter(){ //one could also use perfect forwarding to pass arguments to T's constructor 
     sorter_.reset(new T()); 
    } 
    void sort(std::list<string> &list){ 
     sorter_->sort(list); 
    } 
}; 

int main(){ 
    std::list<int> li; 
    Interface cn; 
    cn.sort(li); //using a default sort 
    cn.setSorter<CBubbleSort>(); 
    cn.sort(li); //using bubble sort 
}