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

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

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

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

Ответы [ 16 ]

2 голосов
/ 10 ноября 2016

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

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

Шаблонный метод проектирования Шаблон

  • Благоприятствует наследованию над композицией
  • Определите алгоритм в вашем базовом классе. Отдельные части алгоритма могут быть настроены в дочерних классах.
2 голосов
/ 05 сентября 2011

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

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

2 голосов
/ 07 мая 2011

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

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

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

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

1 голос
/ 16 февраля 2016

Шаблон:

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

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 хранилище .

0 голосов
/ 28 июля 2016

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

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

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

} Реализация методов Step1 и Step2 может быть задана производными классами.

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

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

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

0 голосов
/ 22 июня 2016

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

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

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

...