В чем разница между шаблонным методом и шаблонами стратегии? - PullRequest
148 голосов
/ 21 марта 2009

Может кто-нибудь объяснить мне, в чем разница между шаблоном метода шаблона и шаблоном стратегии?

Насколько я могу судить, они на 99% одинаковые - единственная разница что шаблон шаблона шаблона имеет абстрактный класс в качестве основы класс, тогда как класс стратегии использует интерфейс, который реализован по каждому конкретному классу стратегии.

Однако, что касается клиента , они потребляются точно таким же образом - это правильно?

Ответы [ 16 ]

118 голосов
/ 21 марта 2009

Основное различие между ними заключается в выборе конкретного алгоритма.

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

class ConcreteAlgorithm : AbstractTemplate
{
    void DoAlgorithm(int datum) {...}
}

class AbstractTemplate
{
    void run(int datum) { DoAlgorithm(datum); }

    virtual void DoAlgorithm() = 0; // abstract
}

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

class ConcreteAlgorithm : IAlgorithm
{
    void DoAlgorithm(int datum) {...}
}

class Strategy
{
    Strategy(IAlgorithm algo) {...}

    void run(int datum) { this->algo.DoAlgorithm(datum); }
}

В итоге:

  • Шаблон метода шаблона: время компиляции выбор алгоритма с помощью подклассов
  • Шаблон стратегии: алгоритм выполнения выбор по сдерживание
116 голосов
/ 21 марта 2009

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

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

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

22 голосов
/ 21 марта 2009

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

Стратегия
Инкапсулирует алгоритм внутри класса
Ссылка на изображение enter image description here

Шаблонный метод
Отложите точные шаги алгоритма на подкласс
Ссылка на изображение enter image description here

22 голосов
/ 21 марта 2009

Вы, вероятно, имеете в виду шаблонный шаблон. Вы правы, они удовлетворяют очень похожие потребности. Я бы сказал, что лучше использовать метод шаблона в тех случаях, когда у вас есть «шаблонный» алгоритм, имеющий определенные шаги, где подклассы переопределяют эти шаги, чтобы изменить некоторые детали. В случае стратегии вам нужно создать интерфейс, и вместо наследования вы используете делегирование. Я бы сказал, что это немного более мощный паттерн и, возможно, лучше в соответствии с принципами инверсии зависимостей DIP. Он более мощный, потому что вы четко определяете новую абстракцию стратегии - способ сделать что-то, что не относится к шаблонному методу. Итак, если эта абстракция имеет смысл - используйте ее. Тем не менее, использование метода шаблона может дать вам более простой дизайн в простых случаях, что также важно. Подумайте, какие слова подходят лучше: у вас есть шаблонный алгоритм? Или ключевым моментом здесь является то, что у вас есть абстракция стратегии - новый способ что-то сделать

Пример метода шаблона:

Application.main()
{
Init();
Run();
Done();
}

Здесь вы наследуете от приложения и подставляете, что именно будет сделано при инициализации, запуске и выполнении.

Пример стратегии:

array.sort (IComparer<T> comparer)

Здесь при написании компаратора вы не наследуете от массива. Array делегирует алгоритм сравнения для сравнения.

19 голосов
/ 12 сентября 2016

Difference between Strategy and Template Method Pattern Strategy vs Template method


Сходство

У шаблонов стратегий и шаблонов много общего. Шаблоны методов Стратегии и Шаблонов могут использоваться для удовлетворения принципа Открыто-Закрыто и облегчения расширения программного модуля без изменения его кода. Оба шаблона представляют собой отделение универсальной функциональности от детальной реализации этой функциональности. Однако они немного отличаются с точки зрения гранулярности, которую они предлагают.


Различия

Вот некоторые различия, которые я наблюдал при изучении этих двух паттернов:

  1. В Стратегии связь между клиентом и стратегией больше в то время как в шаблонном методе два модуля более плотно в сочетании.
  2. В стратегии в основном используется интерфейс, хотя абстрактный класс может также будет использоваться в зависимости от ситуации, а конкретный класс не используется в то время как в методе Template в основном абстрактный класс или конкретный класс используется, интерфейс не используется.
  3. В паттерне Стратегия, как правило, все поведение класса с точки зрения интерфейса, с другой стороны, используется метод Template для уменьшения дублирования кода и шаблон кода определяется в базовый каркас или абстрактный класс. В Template Method может быть даже конкретный класс с реализацией по умолчанию.
  4. Проще говоря, вы можете изменить всю стратегию (алгоритм) в Шаблон стратегии, однако, в методе Template, только некоторые вещи изменение (части алгоритма) и все остальное остается неизменным. В шаблонном методе инвариантные шаги реализованы в абстрактном базовом классе, а Варианты шагов либо имеют реализацию по умолчанию, либо нет реализация на всех. В методе Template конструктор компонента мандаты необходимые шаги алгоритма, а также порядок шаги, но позволяет клиенту компонента расширить или заменить некоторые количество этих шагов.

Изображение взято из укушенного блога.

16 голосов
/ 21 марта 2009

Наследование против агрегации (есть-а-есть-а). Это два способа достижения одной и той же цели.

Этот вопрос показывает некоторые компромиссы между вариантами: Наследование против агрегации

10 голосов
/ 26 января 2012

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

Разница между ними заключается в том, что, хотя шаблон стратегии позволяет различным реализациям использовать совершенно разные способы достижения желаемого результата, шаблон метода шаблона определяет всеобъемлющий алгоритм ( метод «шаблона»), который используется для достижения результата - единственный выбор, оставленный конкретным реализациям (подклассам), - это определенные детали упомянутого метода шаблона. Это достигается путем вызова метода (ов) метода шаблона одним или несколькими abstract методами, которые переопределяются (то есть реализуются) подклассами, в отличие от метода шаблона, который сам по себе не является абстрактным и не является переопределено подклассами.

Клиентский код вызывает метод шаблона, используя ссылку / указатель абстрактного типа класса, указывающего на экземпляр одного из конкретных подклассов, который может быть определен во время выполнения точно так же, как при использовании шаблона стратегии.

5 голосов
/ 10 февраля 2016

Шаблонный метод:

  1. Он основан на наследовании
  2. Определяет каркас алгоритма, который не может быть изменен подклассами. Только определенные операции могут быть переопределены в подклассах
  3. Родительский класс полностью контролирует алгоритм и отличается только определенными шагами от конкретных классов
  4. Связывание выполняется во время компиляции

Template_method структура:

enter image description here

Стратегия:

  1. Он основан на делегировании / составе
  2. Изменяет внутренности объекта , изменяя поведение метода
  3. Используется для переключения между семействами алгоритмов
  4. Он изменяет поведение объекта во время выполнения, полностью заменяя один алгоритм другим алгоритмом во время выполнения
  5. Связывание выполняется во время выполнения

Стратегия Структура:

enter image description here

Взгляните на Шаблонный метод и Стратегия статьи для лучшего понимания.

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

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

Пример шаблона стратегии в реальном мире

3 голосов
/ 28 февраля 2014

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

Цитата из статьи

" Как видно, классы реализации также зависят от шаблона. метод класса. Эта зависимость вызывает изменение метода шаблона, если каждый хочет изменить некоторые шаги алгоритма. С другой побочная стратегия полностью инкапсулирует алгоритм. это дает реализация классов для полного определения алгоритма. Поэтому если любое изменение приходит, нужно изменить код для ранее письменные занятия. Это было основной причиной, по которой я выбираю стратегию проектирование классов.

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

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

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

3 голосов
/ 21 марта 2009

Нет, они не обязательно потребляются таким же образом. Шаблон «метод шаблона» - это способ предоставления «руководства» будущим разработчикам. Вы говорите им: «Все объекты Person должны иметь номер социального страхования» (это тривиальный пример, но он дает правильное представление).

Шаблон стратегии позволяет включать и выключать несколько возможных реализаций. Это (обычно) не реализуется через наследование, но вместо этого позволяет вызывающей стороне передать желаемую реализацию. В качестве примера можно привести предоставление ShippingCalculator одним из нескольких различных способов расчета налогов (возможно, реализация NoSalesTax и реализация PercentageBasedSalesTax).

Итак, иногда клиент фактически сообщает объекту, какую стратегию использовать. Как в

myShippingCalculator.CalculateTaxes(myCaliforniaSalesTaxImpl);

Но клиент никогда бы не сделал это для объекта, основанного на шаблонном методе. Фактически, клиент может даже не знать, что объект основан на шаблонном методе. Эти абстрактные методы в шаблоне Template Method могут быть даже защищены, и в этом случае клиент даже не узнает, что они существуют.

...