模板方法和策略设计模式之间有什么相似之处

时间:2012-04-29 21:13:49

标签: java design-patterns strategy-pattern template-method-pattern

这是TemplateMethod Pattern的一个例子吗?

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 个答案:

答案 0 :(得分:3)

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

Template方法定义算法的 outline ,并让子类成为算法实现的一部分。因此,您可以使用不同的算法步骤实现,但保留算法的结构

因此,您可以看到 intent 在每种模式中都有所不同。所以这不是一个优势的问题。

答案 1 :(得分:2)

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

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

E.g。你想煮smth,你的食谱是:

  1. 采取ingridients
  2. 将它们放入
  3. 给smbd提供coocked食物
  4. 在java中,配方只是某些Recipe

    中的方法
    void cook(){
      takeIngridients();
      putIt();  // abstract
      heat();  //abstract
      giveFood();
    }
    

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

答案 2 :(得分:1)

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

另一方面,当您发现模板方法实现是冗余的或导致同一树的多个子类的重复代码时,更喜欢策略模式,以便您的代码被分解。

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

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

答案 3 :(得分:1)

<强>相似点:

  1. 模板方法&amp; 策略是行为模式。
  2. 两种模式都用于通过子类更改算法,但有区别 - 部分或完整
  3. 为了更好地理解这两个特征,我们必须了解这两种模式实现的核心差异。

    核心差异:

    1. 模板方法使用继承,策略使用合成
    2. 不应覆盖基类实现的模板方法 通过这种方式,算法的结构由超类控制,细节在子类中实现
    3. 策略将算法封装在接口后面,这使我们能够在运行时更改算法
    4. 相关帖子:

      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条款,以便更好地理解。