2013-02-25 151 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 
}