5

这是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模式让子类的处理有什么变化。当你想使用一些父类的字段和

回答

1

模板方法模式是有用的,当你的代码是不是一个真正的整体算法,但只有一些“逻辑”非常具体到您的类层次结构。

在另一方面,当你发现你的模板方法的实现是多余的,或者导致重复码跨同一棵树上的几个子类,喜欢策略模式,使您的代码将被因式分解。

此外,模板方法,通过子类的方式工作,你无法与战略格局改变你在运行时的行为,而所有你所要做的就是用二传手,每当你想改变你的行为。

在其他情况下,这两种模式都非常相似,你经常可以选择一个你喜欢的。

2

是的,你可以使用策略模式,而不是模板方法,但在特殊情况下,你会重复算法逻辑。

的最佳使用案例模板的方法来替代由具体的实现一些抽象的方法。

E.g.你想做饭不便和你的食谱是:

  1. 采取ingridients
  2. 把它们放到
  3. 给予coocked食品SMBD

在java中的配方只是一些方法Recipe

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

您创建PanRecipe类扩展Recipe并实现使用泛的抽象方法。 另一个类可以是GrillRecipe并实现使用烤架的方法。现在您可以通过grillRecipe.cook()来调用它,而不是策略模式,不需要复制重复方法takeIngridientsgiveFood的执行。

3

Strategy图案定义了一系列的算法和使它们可互换。由于算法是封装的,客户端代码可以使用不同的算法。

Template方法定义了算法的概要,并让子类成为算法实现的一部分。所以,你可以有一个算法的步骤,不同的实现,但保留算法的结构

因此,大家可以看到意图是每个模式的不同。所以这不是一个优势的问题。

1

相似之处:

  1. 两个模板方法& 战略的行为模式。
  2. 两种模式使用的子类,但与别不同的改变的算法 - 部分或完全

为了更好地理解这两个特点,我们要了解在执行这两种模式的核心差异。

核心区别:

  1. 模板方法使用继承和策略使用组合物
  2. 由基类实现的模板方法应该不能被重写。 通过这种方式,算法的结构是由超类控制和细节在子类
  3. 战略封装的接口背后的算法,它为我们提供了改变算法的能力来实现在运行时

相关文章:

Real World Example of the Strategy Pattern

Template design pattern in JDK, could not find a method defining set of methods to be executed in order

看看Template methodStrategy文章,以便更好地理解。

相关问题