Каковы сходства между шаблонным методом и шаблонами разработки стратегии
Это пример шаблона 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
Метод определяет схему алгоритма и позволяет подклассам участвовать в реализации алгоритма. Таким образом, вы можете иметь различные реализации шагов алгоритма, но сохранить структуру алгоритма
Итак, как вы можете видеть, намерение отличается в каждом шаблоне. Так что это не вопрос преимущества одного над другим.
Да, вы можете использовать шаблон стратегии вместо шаблона, но в особом случае вы будете повторять логику алгоритма.
Наилучший вариант использования шаблонного метода для замены какого-либо абстрактного метода конкретной реализацией.
Например, вы хотите приготовить что-нибудь, и ваш рецепт:
- принимать ингредиенты
- положить их в
- высокая температура
- давать кому-л.
В Java рецепт это просто метод в некоторых Recipe
учебный класс
void cook(){
takeIngridients();
putIt(); // abstract
heat(); //abstract
giveFood();
}
Вы создаете PanRecipe
класс расширяется Recipe
и реализовать абстрактные методы для использования панорамирования. Другой класс может быть GrillRecipe
и реализовать методы использования гриля. Теперь вы можете просто позвонить по grillRecipe.cook()
и вместо паттерна стратегии не нужно копировать реализацию повторяющихся методов takeIngridients
а также giveFood
,
Шаблонный метод pattern полезен, когда вы хотите использовать поля некоторых родительских классов и когда ваша реализация на самом деле представляет собой не целый алгоритм, а только некоторую "логику", очень специфичную для вашей иерархии классов.
С другой стороны, когда вы обнаружите, что ваши реализации методов шаблона избыточны или приводят к дублированию кода в нескольких подклассах одного и того же дерева, предпочтите шаблон стратегии, чтобы ваш код был разложен.
Кроме того, шаблонный метод работает на основе подклассов, вы не можете изменить свое поведение во время выполнения, в то время как с шаблоном Стратегия все, что вам нужно сделать, это использовать setter для изменения вашего поведения, когда вы пожелаете.
Во всех других случаях эти два шаблона очень похожи, и вы часто можете выбрать тот, который вам нравится.
сходства:
- И шаблонный метод, и стратегия являются поведенческими паттернами.
- Оба шаблона используются для изменения алгоритма по подклассам, но с различием - частичное или полное
Для лучшего понимания этих двух функций нам необходимо понять основные различия в реализации этих двух шаблонов.
Основные отличия:
- Шаблонный метод использует Наследование, а Стратегия использует композицию
- Метод Template, реализованный базовым классом, не должен быть переопределен. Таким образом, структура алгоритма контролируется суперклассом, а детали реализуются в подклассах.
- Стратегия инкапсулирует алгоритм за интерфейсом, что дает нам возможность изменять алгоритм во время выполнения
Похожие сообщения:
Пример шаблона стратегии в реальном мире
Взгляните на метод шаблонов и статьи по стратегии для лучшего понимания.