提问者:小点点

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


这是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 Pattern让子类处理变化的内容。


共3个答案

匿名用户

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

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

正如你所看到的,每个模式的意图是不同的。所以这不是一个比另一个有利的问题。

匿名用户

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

模板方法的最佳用例,通过具体实现来替换一些抽象方法。

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

  1. 把inridients
  2. 把它们放进
  3. 把煮熟的食物给smbd

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

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

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

匿名用户

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

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

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

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