5

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

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

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;   
};
4

6 回答 6

7

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

于 2010-06-02T20:44:26.830 回答
2

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

于 2010-06-02T20:42:20.937 回答
2

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

享受!

于 2010-06-02T20:48:50.127 回答
1

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

于 2010-09-21T03:37:00.587 回答
0

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

于 2010-06-02T20:43:31.943 回答
0

恕我直言,您正面临挑战,因为您在具体算法的创建方面和算法的实际运行之间感到困惑。只要'DoSomething'界面保持不变,Strategy Pattern就可以使用。在您的情况下,只有创建不同的具体算法会有所不同,这可以通过Factory Method设计模式来处理。

于 2010-09-21T04:44:51.617 回答