5

这是模板方法模式的一个例子吗?

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

我注意到的是 Strategy 模式封装了不同的东西,而 TemplateMethod 模式让子类处理了不同的东西。

4

4 回答 4

3

Strategy模式定义了一系列算法并使它们可以互换。客户端代码可以使用不同的算法,因为算法是封装的。

Template方法定义了算法的轮廓,并让子类成为算法实现的一部分。因此,您可以对算法步骤进行不同的实现,但保留算法的结构

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

于 2012-04-30T09:26:56.787 回答
2

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

模板方法的最佳用例是通过特定实现替换一些抽象方法。

例如,你想做饭,你的食谱是:

  1. 服用成分
  2. 把它们放进
  3. 给 smbd 煮熟的食物

在java中配方只是某些Recipe类中的方法

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

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

于 2012-04-29T21:58:31.303 回答
1

当您想要使用某些父类的字段并且您的实现不是真正的完整算法而只是一些非常特定于您的类层次结构的“逻辑”时,模板方法模式很有用。

另一方面,当您发现您的模板方法实现是冗余的或导致同一棵树的多个子类之间出现重复代码时,请首选策略模式,以便您的代码将被分解。

此外,模板方法通过子类化的方式工作,您无法在运行时更改您的行为,而使用策略模式,您所要做的就是随时使用 setter 来更改您的行为。

在所有其他情况下,这两种模式非常相似,您通常可以选择您喜欢的一种。

于 2012-04-29T21:43:13.800 回答
1

相似之处:

  1. 模板方法和策略都是行为模式。
  2. 两种模式都用于按子类更改算法,但有所不同 - 部分或全部

为了更好地理解这两个特性,我们必须了解这两种模式实现的核心差异。

核心差异:

  1. 模板方法使用继承,策略使用组合
  2. 基类实现的Template 方法不应被覆盖。这样,算法的结构由超类控制,细节在子类中实现
  3. Strategy将算法封装在一个接口后面,这为我们提供了在运行时更改算法的能力

相关文章:

策略模式的真实示例

JDK中的模板设计模式,找不到定义要按顺序执行的方法集的方法

查看模板方法策略文章以获得更好的理解。

于 2016-02-13T17:39:17.257 回答