Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模板方法和策略设计模式之间有什么相似之处_Java_Design Patterns_Strategy Pattern_Template Method Pattern - Fatal编程技术网

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

Java 模板方法和策略设计模式之间有什么相似之处,java,design-patterns,strategy-pattern,template-method-pattern,Java,Design Patterns,Strategy Pattern,Template Method Pattern,这是TemplateMethod模式的一个示例吗 public abstract class Character{ public final void useWeapon(){ useBusterSword(); useMateriaBlade(); useUltimateWeapon(); } public abstract void useBusterSword(); public abstract void

这是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模式的变化。TemplateMethod模式允许子类处理变化的内容。

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

另一方面,当您发现您的模板方法实现是冗余的或导致代码在同一树的多个子类之间重复时,请选择策略模式,以便对代码进行分解

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


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

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

模板方法的最佳使用案例是通过具体的实现来替代某些抽象方法

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

  • 取笑
  • 把它们放进
  • 热度
  • 给smbd喂食
  • 在java中,recipe只是一些
    recipe
    类中的方法

    void cook(){
      takeIngridients();
      putIt();  // abstract
      heat();  //abstract
      giveFood();
    }
    
    创建
    PanRecipe
    类扩展
    Recipe
    并实现抽象方法来使用pan。
    另一个类可以是
    GrillRecipe
    ,并实现使用grill的方法。现在您可以通过
    grillRecipe.cook()
    调用它,而不需要复制重复方法的实现
    takeingrides
    giveFood
    strategy
    模式定义了一系列算法并使它们可互换。客户端代码可以使用不同的算法,因为算法是封装的

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


    因此,正如您所看到的,意图在每个模式中都是不同的。因此,这不是一个优势大于另一个的问题。

    相似性:

  • 模板方法和策略都是行为模式
  • 这两种模式都用于按子类更改算法,但有部分或全部不同
  • 为了更好地理解这两个特性,我们必须理解这两种模式实现中的核心差异

    核心差异:

  • 模板方法使用继承,策略使用组合
  • 不应重写基类实现的模板方法这样,算法的结构由超类控制,细节在子类中实现
  • 该策略将算法封装在一个接口后面,使我们能够在运行时更改算法
  • 相关职位:

    为了更好地理解,请查看和阅读文章