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

Это пример шаблона TemplateMethod??

public abstract class Character{

    public final void useWeapon(){
        useBusterSword();
        useMateriaBlade();
        useUltimateWeapon();
    }

    public abstract void useBusterSword();
    public abstract void useMateriaBlade();
    public abstract void useUltimateWeapon();
}

public class Cloud extends Character{

    public void useUltimateWeapon() {
        System.out.println("Change Weapon to Ultima Weapon");
    }


    public void useBusterSword() {

    }


    public void useMateriaBlade() {

    }
}


public class TestGame {
    public static void main(String[] args){
        Character cloud = new Cloud();
        cloud.useWeapon();
    }
}

Если так, то в чем преимущество использования этого шаблона, чем шаблон стратегии?

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

public class Character {
    WeaponBehavior w;
    public void setWeaponBehavior(WeaponBehavior wb){
        w = wb;
    }

    public void useWeapon(){
        w.useWeapon();
    }
}

public class Cloud extends Character{

    public Cloud(){
        w = new UltimaWeapon();
    }

}


public interface WeaponBehavior {
    public void useWeapon();
}

public class UltimaWeapon implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("Change Weapon to UltimaWeapon");
    }

}

public class BusterSword implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("Change Weapon to MateriaBlade");
    }

}

public class MateriaBlade implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("Change Weapon to MateriaBlade");
    }

}

public class TestGame {
    public static void main(String[] args){
        Character c = new Cloud();
        c.useWeapon();
    }
}

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

4 ответа

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

Template Метод определяет схему алгоритма и позволяет подклассам участвовать в реализации алгоритма. Таким образом, вы можете иметь различные реализации шагов алгоритма, но сохранить структуру алгоритма

Итак, как вы можете видеть, намерение отличается в каждом шаблоне. Так что это не вопрос преимущества одного над другим.

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

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

Например, вы хотите приготовить что-нибудь, и ваш рецепт:

  1. принимать ингредиенты
  2. положить их в
  3. высокая температура
  4. давать кому-л.

В Java рецепт это просто метод в некоторых Recipe учебный класс

void cook(){
  takeIngridients();
  putIt();  // abstract
  heat();  //abstract
  giveFood();
}

Вы создаете PanRecipe класс расширяется Recipe и реализовать абстрактные методы для использования панорамирования. Другой класс может быть GrillRecipe и реализовать методы использования гриля. Теперь вы можете просто позвонить по grillRecipe.cook()и вместо паттерна стратегии не нужно копировать реализацию повторяющихся методов takeIngridients а также giveFood,

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

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

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

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

сходства:

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

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

Основные отличия:

  1. Шаблонный метод использует Наследование, а Стратегия использует композицию
  2. Метод Template, реализованный базовым классом, не должен быть переопределен. Таким образом, структура алгоритма контролируется суперклассом, а детали реализуются в подклассах.
  3. Стратегия инкапсулирует алгоритм за интерфейсом, что дает нам возможность изменять алгоритм во время выполнения

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

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

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

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

Другие вопросы по тегам