C++ 哪种设计模式最合适?

C++ 哪种设计模式最合适?,c++,design-patterns,inheritance,strategy-pattern,code-design,C++,Design Patterns,Inheritance,Strategy Pattern,Code Design,我想创建一个类,它可以使用四种算法中的一种(要使用的算法只有在运行时才知道)。我认为策略设计模式听起来很合适,但我的问题是,每个算法都需要稍微不同的参数。使用策略,但将相关参数传递给构造函数,这会是一个糟糕的设计吗 下面是一个例子(为了简单起见,假设只有两种可能的算法) 我认为这是正确的,如果您在创建新策略时拥有所需的所有参数,并且您所做的对所有阅读代码的人来说都很清楚。您还可以使用包含键值对的内存块的单个接口传递参数。这样,任何现有和未来算法之间的接口都是通用的。每个算法实现都知道如何将键值对

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

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


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

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

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

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


享受吧

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

我想,您正面临着挑战,因为您混淆了具体算法的创造性和算法的实际运行。只要
'DoSomething'
界面保持不变,就可以使用
策略模式。只是创建了不同的具体算法,在您的案例中有所不同,这可以通过
工厂方法
设计模式来处理。

这种方法会不会破坏策略模式的整体思想,因为调用策略的代码需要知道正在使用哪个策略,才能知道要传递哪些键/值对?不,这只会影响策略类的实现。它将是一个统一的算法,而不是构造具有唯一接口的算法。应用程序接口不应更改。对于一小部分算法来说,这样做的成本可能很高,但如果这个数字可以增加到几十个或更多,那么维护起来可能会更简单。@Eric,我想这取决于您是否希望客户端始终提供相同的键->值对。当然,这就引出了一个问题:为什么需要键->值对。与其尝试将您的代码放入某个预设的模式中,不如设计一个对您来说最清晰(希望对其他人来说也是最清晰)且易于维护的模式。换句话说:设计模式很糟糕。如果你找到一个优雅的方法来解决一个问题,就用它;它是否违反了一些任意的设计模式是无关紧要的。另外,如果你给我们多一点(这些参数是如何传递的,等等),我们可以给你一个更好的答案。但就像它看起来一样,对我来说似乎是一个很好的解决方案。
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;   
};