这是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模式不同的内容,让子类处理变化的内容。
答案 0 :(得分:3)
Strategy
模式定义了一系列算法并使它们可互换。客户端代码可以使用不同的算法,因为算法是封装的。
Template
方法定义算法的 outline ,并让子类成为算法实现的一部分。因此,您可以使用不同的算法步骤实现,但保留算法的结构
因此,您可以看到 intent 在每种模式中都有所不同。所以这不是一个优势的问题。
答案 1 :(得分:2)
是的,您可以使用策略模式而不是模板方法,但在特殊情况下,您将重复算法逻辑。
模板方法的最佳用例,用于通过特定实现替换一些抽象方法。
E.g。你想煮smth,你的食谱是:
在java中,配方只是某些Recipe
类
void cook(){
takeIngridients();
putIt(); // abstract
heat(); //abstract
giveFood();
}
您创建PanRecipe
类扩展Recipe
并实现抽象方法以使用pan。
另一个类可以是GrillRecipe
并实现使用grill的方法。现在您可以通过grillRecipe.cook()
调用它,而不是策略模式,不需要复制重复方法takeIngridients
和giveFood
的实现。
答案 2 :(得分:1)
当您想要使用某些父类的字段并且您的实现不是一个完整的算法而只是某些非常特定于您的类层次结构的“逻辑”时,模板方法模式非常有用。
另一方面,当您发现模板方法实现是冗余的或导致同一树的多个子类的重复代码时,更喜欢策略模式,以便您的代码被分解。
此外,通过子类化方式工作的模板方法,您无法在运行时更改您的行为,而使用策略模式,您所要做的就是使用setter随时更改您的行为。
在所有其他情况下,这两种模式非常相似,您通常可以选择自己喜欢的模式。
答案 3 :(得分:1)
<强>相似点:强>
为了更好地理解这两个特征,我们必须了解这两种模式实现的核心差异。
核心差异:
相关帖子:
Real World Example of the Strategy Pattern
查看Template method和Strategy条款,以便更好地理解。