哪种设计模式最合适?

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

5
不要试图将您的代码适应于某些预设模式,只需设计最清晰且易于维护的代码(对您和其他人都是如此),这比一味追求设计模式更为重要。换言之,设计模式并不总是可行的。如果您找到了解决问题的优雅方式,则应该使用它,无论它是否违反了某种任意的设计模式都是无关紧要的。 - GManNickG
另外,如果您能提供更多信息(例如这些参数是如何传递的等),我们可以给您一个更好的答案。但就目前看来,这似乎是一个不错的解决方案。 - GManNickG
6个回答

7

这是一种有效的设计,因为策略模式要求定义一个接口,任何实现该接口的类都可以作为策略代码运行的有效候选对象,无论它是如何构建的。


2

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


2
你的方法很正确。是的,这就是策略模式的精髓...“独立于实现来变化算法”。你可以给自己一个通用的构造函数,以传递需要初始化你的类的参数,比如一个对象数组。
祝愉快!

1

策略模式在你需要在运行时决定使用哪个算法时非常有用。


0

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


1
这样做不会破坏策略模式的整体思想吗?因为调用策略的代码需要知道使用哪种策略,才能知道要传递哪些键/值对。 - Eric Petroelje
不,这只会影响Strategy类的实现。算法不再使用独特的接口构建,而是使用统一的接口。应用程序接口不应更改。对于少量算法来说,这样做可能代价高昂,但如果算法数量增加到数十个或更多,则维护起来可能更简单。 - Amardeep AC9MF
@Eric,我想这取决于您是否希望客户始终提供相同的键值对。当然,这会引出一个问题,为什么需要键值对。 - Edward Strange

0
在我看来,你面临的挑战是混淆了具体算法的创建方面和算法的实际运行。只要 'DoSomething' 接口保持不变,就可以使用 策略模式。在你的情况下,只有不同具体算法的创建是不同的,这可以通过 工厂方法 设计模式来处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接