В чем разница между методом шаблонов и шаблонами стратегии?

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

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

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

Ответ 1

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

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

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); }
}

Вкратце:

  • Шаблон метода шаблона: выбор компиляции по подклассу
  • Стратегия: алгоритм выполнения

Ответ 2

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

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

Ответ 3

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

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

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

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

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

array.sort (IComparer<T> comparer)

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Различие между стратегией шаблона и шаблоном Метод шаблона против метода шаблона


Сходства

Шаблоны методов стратегии и шаблонов имеют много общего между ними. Модели шаблонов Strategy and Template могут использоваться для удовлетворения принципа Open-Closed и упрощения продления программного модуля без изменения его кода. Оба шаблона представляют собой разделение общей функциональности от детальной реализации этой функциональности. Однако они немного отличаются по степени детализации, которую они предлагают.


Различия

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

myShippingCalculator.CalculateTaxes(myCaliforniaSalesTaxImpl);

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

Ответ 9

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

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

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

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

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

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

Ответ 10

Шаблон шаблона похож на шаблон стратегии. Эти два шаблона отличаются по объему и методологии.

Стратегия используется, чтобы позволить абонентам изменять весь алгоритм, например, как рассчитать разные типы налогов, в то время как Template Method используется для изменения шагов в алгоритме. Из-за этого стратегия более крупнозернистая. Шаблон позволяет создавать более мелкие элементы управления в последовательности операций и, тем не менее, позволяет изменять эти детали.

Другое главное отличие состоит в том, что Strategy использует делегирование, в то время как Template Method использует наследование. В стратегии алгоритм делегируется другому классу xxxStrategy, к которому объект будет иметь ссылку, но с Template вы подклассифицируете базовые и переопределяющие методы для внесения изменений.

из http://cyruscrypt.blogspot.com/2005/07/template-vs-strategy-patterns.html

Ответ 11

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

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

Ответ 12

Метод шаблона:

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

Template_method:

введите описание изображения здесь

Стратегия:

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

Strategy Структура:

введите описание изображения здесь

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

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

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

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

Ответ 13

Шаблон:

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

public abstract class RobotTemplate {
    /* This method can be overridden by a subclass if required */
    public void start() {
        System.out.println("Starting....");
    }

    /* This method can be overridden by a subclass if required */
    public void getParts() {
        System.out.println("Getting parts....");
    }

    /* This method can be overridden by a subclass if required */
    public void assemble() {
        System.out.println("Assembling....");
    }

    /* This method can be overridden by a subclass if required */
    public void test() {
        System.out.println("Testing....");
    }

    /* This method can be overridden by a subclass if required */
    public void stop() {
        System.out.println("Stopping....");
    }

    /*
     * Template algorithm method made up of multiple steps, whose structure and
     * order of steps will not be changed by subclasses.
     */
    public final void go() {
        start();
        getParts();
        assemble();
        test();
        stop();
    }
}


/* Concrete subclass overrides template step methods as required for its use */
public class CookieRobot extends RobotTemplate {
    private String name;

    public CookieRobot(String n) {
        name = n;
    }

    @Override
    public void getParts() {
        System.out.println("Getting a flour and sugar....");
    }

    @Override
    public void assemble() {
        System.out.println("Baking a cookie....");
    }

    @Override
    public void test() {
        System.out.println("Crunching a cookie....");
    }

    public String getName() {
        return name;
    }
}

Обратите внимание, что в приведенном выше коде шаги алгоритма go() всегда будут одинаковыми, но подклассы могут определять другой рецепт для выполнения определенного шага.

Шаблон стратегии:

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

/**
 * This Strategy interface is implemented by all concrete objects representing an
 * algorithm(strategy), which lets us define a family of algorithms.
 */
public interface Logging {
    void write(String message);
}

/**
 * Concrete strategy class representing a particular algorithm.
 */
public class ConsoleLogging implements Logging {

    @Override
    public void write(String message) {
        System.out.println(message); 
    }

}

/**
 * Concrete strategy class representing a particular algorithm.
 */
public class FileLogging implements Logging {

    private final File toWrite;

    public FileLogging(final File toWrite) {
        this.toWrite = toWrite;
    }

    @Override
    public void write(String message) {
        try {
            final FileWriter fos = new FileWriter(toWrite);
            fos.write(message);
            fos.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }

}

Для получения полного исходного кода ознакомьтесь с моим github репозиторием.

Ответ 14

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

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

http://docs.spring.io/spring/docs/4.1.7.RELEASE/javadoc-api/org/springframework/context/support/AbstractMessageSource.html

Ответ 15

В методе шаблона этого шаблона проектирования один или несколько шагов алгоритма могут быть переопределены подклассами, чтобы допускать различное поведение, гарантируя, что алгоритм перекрытия все еще выполняется (Wiki).

Тип шаблона Шаблон метод означает, что это такое. Скажем, у нас есть метод CalculateSomething(), и мы хотим создать шаблон этого метода. Этот метод будет объявлен в базовом классе не виртуальным методом. Скажем, метод выглядит следующим образом.

CalculateSomething(){
    int i = 0;
    i = Step1(i);
    i++;
    if (i> 10) i = 5;
    i = Step2(i);
    return i;

} Операции Step1 и Step2 могут быть заданы производными классами.

В шаблоне стратегии нет реализации, предоставляемой базой (это причина, по которой база действительно является интерфейсом в диаграмме классов)

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

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

Ответ 16

Шаблон разработки стратегии

  • Поддерживает композицию.
  • Предоставляет гибкость для изменения поведения объекта во время выполнения.
  • Меньшее сцепление между клиентским кодом и кодом решения/алгоритма.

Шаблон дизайна шаблона

  • Навыки по сравнению с композицией
  • Определить алгоритм в базовом классе. Отдельные фрагменты алгоритма могут быть настроены в дочерних классах.