Я хочу создать класс, который может использовать один из четырех алгоритмов (и алгоритм для использования только известен во времени выполнения). Я думал, что шаблон разработки Стратегии звучит соответствующим, но моя проблема состоит в том, что каждый алгоритм требует немного отличающихся параметров. Это был бы плохой дизайн для использования стратегии, но передачи в соответствующих параметрах в конструктора?.
Вот пример (для простоты, скажем, существует только два возможных алгоритма)...
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;
};
Это был бы допустимый дизайн, потому что шаблон Стратегия требует определения интерфейса, и любой класс, который его реализует, является допустимым кандидатом для запуска кода стратегии, независимо от как это устроено.
Вы правы в этом подходе. Да, в этом суть шаблона стратегии ... «Изменяйте алгоритм независимо от реализации». Вы можете просто дать себе общий конструктор для передачи параметров, необходимых для инициализации вашего класса, таких как массив объектов.
Наслаждайтесь!
Вы также можете передавать параметры, используя единственный интерфейс блока памяти, содержащего пары ключ-значение. Таким образом, интерфейс является общим между любыми настоящими и будущими алгоритмами. Каждая реализация алгоритма будет знать, как декодировать пары ключ-значение в свои параметры.
Я думаю, это правильно, если у вас есть все параметры, которые вам нужны при создании новой стратегии, и то, что вы делаете, будет ясно для всех, кто читает код.