Может кто-нибудь объяснить мне, в чем разница между шаблоном метода шаблона и шаблона стратегии?
Насколько я могу судить, они на 99% одинаковые - единственное отличие состоит в том, что шаблон шаблонного метода имеет абстрактный класс в качестве базового класса, тогда как класс стратегии использует интерфейс, который реализуется каждым конкретным классом стратегии.
Однако, что касается клиента , он потребляется точно так же - это правильно?
Ответы:
Основное различие между ними заключается в выборе конкретного алгоритма.
С шаблоном метода Template это происходит во время компиляции путем создания подкласса шаблона. Каждый подкласс предоставляет свой конкретный алгоритм, реализуя абстрактные методы шаблона. Когда клиент вызывает методы внешнего интерфейса шаблона, шаблон вызывает свои абстрактные методы (свой внутренний интерфейс), как требуется для вызова алгоритма.
Напротив, шаблон «Стратегия» позволяет выбирать алгоритм во время выполнения путем локализации . Конкретные алгоритмы реализуются отдельными классами или функциями, которые передаются стратегии в качестве параметра ее конструктору или методу-установщику. Какой алгоритм выбран для этого параметра, может динамически меняться в зависимости от состояния программы или входных данных.
В итоге:
источник
if (config.useAlgoA) impl = new AlgoA() else impl = new AlgoB()
), поэтому этот ответ неверен.new ConcreteAlgorithm1()
противnew ConcreteAlgorithm2()
. Очевидно, что выбор происходит во время выполнения (выбор алгоритма во время компиляции будет означать его жесткое программирование). Основное различие между ними заключается в том, как реализован конкретный алгоритм. Это реализовано как подкласс или как отдельный интерфейс? Первый шаблон. Последнее является стратегией. Различие можно суммировать как состав против наследования, что является общей темой книги GoF.Шаблон шаблона используется, когда конкретная операция имеет некоторые инвариантные поведения, которые могут быть определены с точки зрения других различных примитивных поведений. Абстрактный класс определяет инвариантное поведение (я), в то время как реализующие классы определяют зависимые методы.
В стратегии реализации поведения независимы - каждый реализующий класс определяет поведение, и между ними нет общего кода. Оба являются поведенческими паттернами и, как таковые, потребляются почти одинаково клиентами. Обычно стратегии имеют единственный открытый метод -
execute()
метод, тогда как шаблоны могут определять набор открытых методов, а также набор вспомогательных частных примитивов, которые должны реализовывать подклассы.Две модели могут быть легко использованы вместе. У вас может быть шаблон стратегии, в котором несколько реализаций принадлежат семейству стратегий, реализованных с использованием шаблонного шаблона.
источник
Я думаю, что диаграммы классов обеих моделей показывают различия.
Стратегия
Инкапсулирует алгоритм внутри класса
Ссылка на изображение
Метод шаблона
Отложите точные шаги алгоритма к подклассу
Ссылка на изображение
источник
Вы, вероятно, имеете в виду шаблонный шаблон. Вы правы, они удовлетворяют очень похожие потребности. Я бы сказал, что лучше использовать метод шаблона в тех случаях, когда у вас есть «шаблонный» алгоритм, имеющий определенные шаги, где подклассы переопределяют эти шаги, чтобы изменить некоторые детали. В случае стратегии вам нужно создать интерфейс, и вместо наследования вы используете делегирование. Я бы сказал, что это немного более мощный шаблон и, возможно, лучше в соответствии с принципами инверсии зависимостей DIP. Он более мощный, потому что вы четко определяете новую абстракцию стратегии - способ сделать что-то, что не относится к шаблонному методу. Итак, если эта абстракция имеет смысл - используйте ее. Однако использование шаблонного метода может дать вам более простые конструкции в простых случаях, что также важно. Подумайте, какие слова подходят лучше: у вас есть шаблон алгоритма? Или ключевым моментом здесь является то, что у вас есть абстракция стратегии - новый способ сделать что-то
Пример шаблонного метода:
Здесь вы наследуете от приложения и подставляете, что именно будет сделано при инициализации, запуске и выполнении.
Пример стратегии:
Здесь при написании компаратора вы не наследуете от массива. Array делегирует алгоритм сравнения для сравнения.
источник
сходства
Шаблоны стратегий и шаблонных методов имеют много общего между ними. Шаблоны методов Стратегии и Шаблонов могут использоваться для удовлетворения принципа Открыто-Закрыто и упрощения расширения программного модуля без изменения его кода. Оба шаблона представляют отделение общей функциональности от детальной реализации этой функциональности. Тем не менее, они немного отличаются с точки зрения гранулярности, которую они предлагают.
Различия
Вот некоторые из различий, которые я наблюдал при изучении этих двух моделей:
Изображение взято из укушенного блога.
источник
Наследование против агрегации (есть-а есть-есть). Это два способа достижения одной и той же цели.
Этот вопрос показывает некоторые компромиссы между вариантами выбора: наследование против агрегации
источник
Оба очень похожи, и оба потребляются клиентским кодом одинаковыми способами. В отличие от того, что говорит самый популярный ответ выше, оба позволяют выбор алгоритма во время выполнения .
Разница между ними заключается в том, что, хотя шаблон стратегии позволяет различным реализациям использовать совершенно разные способы достижения желаемого результата, шаблон шаблонного метода задает всеобъемлющий алгоритм («шаблонный» метод), который используется для достижения результата - - единственный выбор, оставленный конкретным реализациям (подклассам), - это определенные детали указанного метода шаблона. Это достигается путем вызова метода (ов) метода шаблона одним или несколькими абстрактными методами, которые переопределяются (то есть реализуются) подклассами, в отличие от метода шаблона, который сам не является абстрактным и не переопределяется подклассами. ,
Код клиента вызывает метод шаблона, используя ссылку / указатель на абстрактный тип класса, указывающий на экземпляр одного из конкретных подклассов, который может быть определен во время выполнения, как при использовании шаблона стратегии.
источник
Метод шаблона:
Структура Template_method :
Стратегия:
Структура стратегии :
Взгляните на метод шаблонов и статьи по стратегии для лучшего понимания.
Похожие сообщения:
Шаблон дизайна шаблона в JDK, не удалось найти метод, определяющий набор методов, которые должны быть выполнены в порядке
Пример шаблона стратегии в реальном мире
источник
Нет, они не обязательно потребляются таким же образом. Шаблон «метод шаблона» - это способ предоставления «руководства» будущим разработчикам. Вы говорите им: «Все объекты Person должны иметь номер социального страхования» (это тривиальный пример, но он дает правильное представление).
Шаблон стратегии позволяет включать и выключать несколько возможных реализаций. Это (обычно) не реализуется через наследование, но вместо этого позволяет вызывающей стороне передать желаемую реализацию. Примером может служить предоставление ShippingCalculator одним из нескольких различных способов расчета налогов (возможно, реализация NoSalesTax и реализация PercentageBasedSalesTax).
Поэтому иногда клиент фактически сообщает объекту, какую стратегию использовать. Как в
Но клиент никогда бы не сделал это для объекта, основанного на шаблонном методе. Фактически, клиент может даже не знать, что объект основан на шаблонном методе. Эти абстрактные методы в шаблоне Template Method могут быть даже защищены, и в этом случае клиент даже не узнает, что они существуют.
источник
Я бы предложил вам прочитать эту статью. Это объясняет различия на реальном примере.
Цитата из статьи
источник
Шаблон Template похож на шаблон Strategy. Эти две модели различаются по объему и методологии.
Стратегия используется для того, чтобы вызывающие абоненты могли изменять весь алгоритм, например, как рассчитывать различные типы налогов, в то время как шаблонный метод используется для изменения шагов в алгоритме. Из-за этого Стратегия является более грубой. Шаблон позволяет более детально контролировать последовательность операций, но при этом позволяет варьировать реализации этих деталей.
Другое основное отличие заключается в том, что в стратегии используется делегирование, а в шаблонном методе используется наследование. В Стратегии алгоритм делегирован другому классу xxxStrategy, на который будет ссылаться субъект, но с помощью Template вы создадите подкласс базового и переопределите методы для внесения изменений.
от http://cyruscrypt.blogspot.com/2005/07/template-vs-strategy-patterns.html
источник
В подклассах шаблонов стратегий выполняется шоу, и они управляют алгоритмом. Здесь код дублируется во всех подклассах. Знание алгоритма и его реализации распространяется на многие классы.
В шаблоне шаблона базовый класс имеет алгоритм. Это максимизирует повторное использование среди подклассов. Поскольку алгоритм лежит в одном месте, базовый класс защищает его.
источник
источник
Шаблон шаблона:
Шаблонный метод позволяет подклассам переопределять определенные этапы алгоритма, не изменяя основную структуру и этапы алгоритма, определенные в базовом классе. Шаблонный шаблон обычно использует наследование, поэтому в базовом классе может быть предоставлена общая реализация алгоритмов, которую подкласс может выбрать для переопределения при необходимости.
Обратите внимание, что в приведенном выше коде шаги алгоритма go () всегда будут одинаковыми, но подклассы могут определять другой рецепт для выполнения определенного шага.
Шаблон стратегии:
Паттерн стратегии позволяет клиенту выбирать реализацию конкретных алгоритмов во время выполнения. Все алгоритмы являются изолированными и независимыми, но реализуют общий интерфейс, и нет понятия определения определенных шагов в алгоритме.
Полный исходный код можно найти в моем репозитории github .
источник
Стратегия представлена как интерфейс и метод шаблона как абстрактный класс. Обычно это часто используется в рамках. Например, класс MessageSource платформы Spring - это интерфейс стратегии для разрешения сообщений. Клиент использует конкретную реализацию (стратегию) этого интерфейса.
И абстрактная реализация того же интерфейса AbstractMessageSource, который имеет общую реализацию разрешения сообщений и предоставляет абстрактный метод resolCode (), чтобы подклассы могли реализовать их по-своему. AbstractMessageSource является примером метода шаблона.
http://docs.spring.io/spring/docs/4.1.7.RELEASE/javadoc-api/org/springframework/context/support/AbstractMessageSource.html
источник
В методе шаблона этого шаблона проектирования один или несколько шагов алгоритма могут быть переопределены подклассами, чтобы обеспечить различное поведение при одновременном соблюдении всеохватывающего алгоритма (Wiki).
Имя шаблона Шаблонный метод означает, что это такое. Скажем, у нас есть метод CalculateSomething (), и мы хотим шаблонировать этот метод. Этот метод будет объявлен в базовом классе не виртуальным методом. Скажем, метод выглядит следующим образом.
} Реализация методов Step1 и Step2 может быть задана производными классами.
В паттерне стратегии нет реализации, предоставляемой базой (это причина, почему база действительно является интерфейсом на диаграмме классов)
Классический пример - сортировка. На основе количества объектов, подлежащих сортировке, создается соответствующий класс алгоритмов (слияние, всплывающие, быстрые и т. Д.), И весь алгоритм инкапсулируется в каждом классе.
Теперь мы можем реализовать сортировку как шаблонный метод? Конечно, вы можете, но вы не найдете много / каких-либо общих черт, которые можно абстрагировать и поместить в базовую реализацию. Так что это побеждает цель шаблона шаблона.
источник