哪种设计模式最合适?

时间:2010-06-02 20:40:02

标签: c++ design-patterns inheritance strategy-pattern code-design

我想创建一个可以使用四种算法之一的类(并且使用的算法仅在运行时才知道)。我认为策略设计模式听起来合适,但我的问题是每个算法需要稍微不同的参数。使用策略是否是一个糟糕的设计,但是将相关参数传递给构造函数?。

这是一个例子(为简单起见,假设只有两种可能的算法)......

class Foo
{
private:
   // At run-time the correct algorithm is used, e.g. a = new Algorithm1(1);
   AlgorithmInterface* a; 

};

class AlgorithmInterface
{
public:
   virtual void DoSomething() = 0;
};

class Algorithm1 : public AlgorithmInterface
{
public:
   Algorithm1( int i ) : value(i) {}
   virtual void DoSomething(){ // Does something with int value };
   int value;   
};

class Algorithm2 : public AlgorithmInterface
{
public:
   Algorithm2( bool b ) : value(b) {}
   virtual void DoSomething(){ // Do something with bool value };
   bool value;   
};

6 个答案:

答案 0 :(得分:7)

这将是一个有效的设计,因为策略模式要求定义接口,并且任何实现它的类都是运行策略代码的有效候选者,无论它是如何构造的。< / p>

答案 1 :(得分:2)

我认为这是正确的,如果您在创建新策略时拥有所需的所有参数,那么您所做的事情对于阅读代码的每个人都很清楚。

答案 2 :(得分:2)

你采用这种方法是正确的。是的,这是策略模式的本质...... “改变算法独立于实现。”您可以给自己一个通用构造函数来传递初始化类所需的参数,例如作为对象数组。

享受!

答案 3 :(得分:1)

当您想要决定运行时使用哪种算法时,策略模式非常有用。

答案 4 :(得分:0)

您还可以使用包含键值对的内存块的单个接口传递参数。这样,接口在任何现有和未来算法之间是通用的。每个算法实现都知道如何将键值对解码为其参数。

答案 5 :(得分:0)

恕我直言,你正面临着挑战,因为你在具体算法的创造性方面和算法的实际运行之间混淆了。只要'DoSomething'接口保持不变,就可以使用Strategy Pattern。只是根据您的情况创建不同的具体算法,可以通过Factory Method设计模式处理。