Каково различие между шаблонным методом и стратегическими моделями?

Вы можете попробовать настроить Git для Windows bash на запомнить последний использованный для вас путь, как показано в « Как открыть новый терминал в том же каталоге, что и последний использовавшийся? один из оконного менеджера keybind? "

Например:

Таким образом, вместо сохранения пути при каждом вызове cd последний путь может быть сохранен при выходе.

My ~/.bash_logout очень прост:

echo $PWD >~/.lastdir

И где-то в моем .bashrc я поместил эту строку:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)
blockquote>

не зависит напрямую от Intellij IDEA, но зависит от базовой настройки bash (здесь bash для Git для Windows упоминается и используется Intellij IDEA.

155
задан Yassin Hajaj 3 August 2018 в 12:22
поделиться

6 ответов

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

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

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

, Таким образом:

  • Шаблонный шаблон метода: время компиляции выбор алгоритма [1 115] разделение на подклассы
  • Стратегическая модель: алгоритм во время выполнения выбор [1 117] включение
126
ответ дан Jeff Axelrod 23 November 2019 в 21:54
поделиться

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

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

Так, иногда, клиент на самом деле скажет объект который стратегия использовать. Как в

myShippingCalculator.CalculateTaxes(myCaliforniaSalesTaxImpl);

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

3
ответ дан Charlie Flowers 23 November 2019 в 21:54
поделиться

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

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

17
ответ дан Community 23 November 2019 в 21:54
поделиться

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

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

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

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

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

array.sort (IComparer<T> comparer)

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

22
ответ дан Paul Kapustin 23 November 2019 в 21:54
поделиться

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

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

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

24
ответ дан Mayank Jaiswal 23 November 2019 в 21:54
поделиться

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

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

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

128
ответ дан Yassin Hajaj 23 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: