Java 模板方法和策略设计模式之间有什么相似之处
这是TemplateMethod模式的一个示例吗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
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,你的食谱是:
recipe
类中的方法
void cook(){
takeIngridients();
putIt(); // abstract
heat(); //abstract
giveFood();
}
创建PanRecipe
类扩展Recipe
并实现抽象方法来使用pan。
另一个类可以是
GrillRecipe
,并实现使用grill的方法。现在您可以通过grillRecipe.cook()
调用它,而不需要复制重复方法的实现takeingrides
和giveFood
strategy
模式定义了一系列算法并使它们可互换。客户端代码可以使用不同的算法,因为算法是封装的
Template
方法定义了算法的大纲,并让子类成为算法实现的一部分。因此,您可以使用不同的算法步骤实现,但保留算法的结构
因此,正如您所看到的,意图在每个模式中都是不同的。因此,这不是一个优势大于另一个的问题。相似性: