Подтвердить что ты не робот

Какая разница между шаблонами Strategy, Visitor и Template Method?

Я в классе, где мы узнали об этих шаблонах проектирования. Однако я не видел никакой разницы между ними. Они звучат точно так же, создавая конкретные классы над абстрактным. Может ли кто-нибудь помочь мне убить это сомнение? спасибо (:

4b9b3361

Ответ 1

Оба посетителя, стратегия и шаблон шаблона охватывают применение алгоритма. Самая большая разница в том, как они вызваны и как они используются на практике. Хотя может показаться, что они имеют один и тот же вариант использования, посмотрите на конструкцию объектов, чтобы увидеть разницу.

Шаблон стратегии часто используется, когда у нас нет возможности передавать функции как объект первого класса. Он ожидает очень специфический список аргументов и только этот список аргументов в своем шаблоне вызовов. Например:

struct MyStrat{
    void operator()(const Foo &_input){
        _input.up( 2 );
    }
};

std::for_each( myFooList.begin(), myFooList.end(), MyStrat() );

который затем применяется к списку объектов типа "Foo". У нас действительно нет другого способа применить его к любому другому объекту.

Образец посетителя, с другой стороны, используется, когда мы хотим применить алгоритм к совокупности объектов, которые могут не иметь одной и той же сигнатуры или иметь одни и те же функции-члены. Мы говорим шаблон посетителя, потому что он часто используется при обходе дерева или другой коллекции "несвязанных" объектов (не связанных в смысле наследования).

struct MyVisitor{
    void visit(const Foo &_input){
         _input.up( 2 );
    }
    void visit(const Bar &_input){
         _input.raiseUp( 2 );
    }
    void visit(const Baz &_input){
         _input.setUp( 2 );
    }
 };

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

Используя шаблон посетителя, мы избегаем необходимости обертывания каждого класса в прокси-шаблоне. Следовательно, для N классов мы хотели бы применить этот алгоритм, чтобы нам не нужно было делать N прокси-классов. Нам нужно только добавить методы N в класс посетителя.

Метод шаблона сильно отличается от шаблона посетителя и стратегии. С шаблоном то, что вы пытаетесь сделать, - это применять один и тот же тип алгоритма, но в разных подклассах внутри иерархии. Например:

class Duck{
public:
    int count() =0;
    void makeNoise(int times) =0;
    void quack(){ makeNoise( count() ); }//the template pattern is here
};

class Mallard : public Duck{
public:
    int count(){ return 4; }
    void makeNoise( cout << "quack" << endl; }
};

class Daffy{
public:
    int count(){ return 1; }
    void makeNoise( cout << "Why I ought to..." << endl; }
};

Таким образом, результат алгоритма варьируется в пределах иерархии.

Ответ 2

Общность:

  • Стратегия, метод шаблона и посетитель. Все три шаблона классифицируются как поведенческие шаблоны.

Отличия:

  • Метод шаблона использует Inheritance и Стратегия использует композицию
  • Метод Template, реализованный базовым классом, не должен быть переопределен. Таким образом, структура алгоритма контролируется суперклассом, а детали реализуются в подклассах
  • Стратегия инкапсулирует алгоритм интерфейса, который дает нам возможность изменять алгоритм во время выполнения
  • Шаблон посетителей используется для выполнения операции над группой похожих объектов. С помощью шаблона посетителя мы можем переместить оперативную логику из объектов в другой класс.
  • Если есть изменения в реализации операции, нам нужно просто изменить класс Посетитель, а не касаться всех других объектов.

Посмотрите Метод шаблона, Strategy и Visitor и Sourcemaking статьи для лучшего понимания.

Похожие сообщения:

Когда следует использовать шаблон дизайна посетителя?

Реальный мир Пример шаблона стратегии

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