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

use*_*686 5 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,使用这种模式比战略模式有什么好处?

战略模式

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我注意到的是策略模式封装了与TemplateMethod模式不同的变化,让子类处理变化的内容.

Mik*_*378 1

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

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

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

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