Какой шаблон дизайна наиболее подходит? - PullRequest
6 голосов
/ 03 июня 2010

Я хочу создать класс, который может использовать один из четырех алгоритмов (и используемый алгоритм известен только во время выполнения). Я думал, что шаблон проектирования стратегии звучит правильно, но моя проблема в том, что каждый алгоритм требует немного разных параметров. Будет ли плохой дизайн использовать стратегию, но передавать соответствующие параметры в конструктор?.

Вот пример (для простоты, скажем, есть только два возможных алгоритма) ...

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 ]

7 голосов
/ 03 июня 2010

Это был бы правильный дизайн, потому что шаблон Strategy запрашивает интерфейс, который нужно определить, и любой класс, который его реализует, является допустимым кандидатом для запуска кода стратегии, независимо от того, как он построен. *

2 голосов
/ 03 июня 2010

Вы правы с этим подходом.Да, в этом суть паттерна стратегии ... "Изменяйте алгоритм независимо от реализации." Вы можете просто дать себе универсальный конструктор для передачи параметров, необходимых для инициализации вашего класса, таких какмассив объектов.

Наслаждайтесь!

2 голосов
/ 03 июня 2010

Я думаю, это правильно, если у вас есть все параметры, которые вам нужны, когда вы создаете новую стратегию, и то, что вы делаете, понятно для всех, кто читает код.

1 голос
/ 21 сентября 2010

Шаблон стратегии полезен, когда вы хотите решить, какой алгоритм будет использоваться во время выполнения.

0 голосов
/ 21 сентября 2010

ИМХО, вы сталкиваетесь с проблемой, поскольку путаете между творческим аспектом конкретного алгоритма и фактическим выполнением алгоритма. Пока интерфейс 'DoSomething' остается прежним, можно использовать Strategy Pattern. Это только создание другого конкретного алгоритма, который варьируется в вашем случае, который может быть обработан с помощью Factory Method шаблона проектирования.

0 голосов
/ 03 июня 2010

Вы также можете передавать параметры, используя один интерфейс блока памяти, содержащего пары ключ-значение. Таким образом, интерфейс является общим для любых настоящих и будущих алгоритмов. Каждая реализация алгоритма знает, как декодировать пары ключ-значение в свои параметры.

...