[b]定义[/b]:在一个方法中定义一个算法骨架,而将一些步骤延伸到子类中。(其本质:把可变和不可变进行分类。可变部分延伸到子类来完成,不变部分交给父类定义成骨架)
[b]优点[/b]:
1)可以使的子类可以在不改变算法骨架的情况下,重新定义算法中的某些步骤。
2)模版方法通过把不变的部分搬移到超类,去除了子类中的重复代码。
3)子类实现算法的特定步骤,有利于算法的扩展。
4) 通过一个父类调用子类实现的操作,通过子类扩展新的行为,符合“开放-封闭原则”。
[b]缺点:[/b]每一个不同的实现都需要一个子类来完成,这个会导致子类个数的增加,设计更抽象。
[b]使用场景[/b]:
1)在某些算法中,有了相同的方法,造成的代码重复。
2)控制子类扩展,子类必须遵守算法规则。
场景:
冲茶水: 冲咖啡:
1) 洗杯子 1)洗杯子
2) 烧开水 2)烧开水
3) 加料(加茶叶) 3)加料(加咖啡)
4) 烫材料(沸水烫茶叶)4)烫材料(温水冲咖啡)
分析:
[b]不变部分[/b]:冲咖啡和冲茶水的步骤是一样的,抽象部分(不变部分:1洗杯子、2烧开水、3加料、4烫材料)
[b]可变部分[/b]:加料和烫料是可变部分。因此此部分需要交给子类扩展延伸,保证了代码在骨架上的重用。
1、定义模版(冲水模版)
2、冲茶叶
2、冲咖啡
测试
[b]优点[/b]:
1)可以使的子类可以在不改变算法骨架的情况下,重新定义算法中的某些步骤。
2)模版方法通过把不变的部分搬移到超类,去除了子类中的重复代码。
3)子类实现算法的特定步骤,有利于算法的扩展。
4) 通过一个父类调用子类实现的操作,通过子类扩展新的行为,符合“开放-封闭原则”。
[b]缺点:[/b]每一个不同的实现都需要一个子类来完成,这个会导致子类个数的增加,设计更抽象。
[b]使用场景[/b]:
1)在某些算法中,有了相同的方法,造成的代码重复。
2)控制子类扩展,子类必须遵守算法规则。
场景:
冲茶水: 冲咖啡:
1) 洗杯子 1)洗杯子
2) 烧开水 2)烧开水
3) 加料(加茶叶) 3)加料(加咖啡)
4) 烫材料(沸水烫茶叶)4)烫材料(温水冲咖啡)
分析:
[b]不变部分[/b]:冲咖啡和冲茶水的步骤是一样的,抽象部分(不变部分:1洗杯子、2烧开水、3加料、4烫材料)
[b]可变部分[/b]:加料和烫料是可变部分。因此此部分需要交给子类扩展延伸,保证了代码在骨架上的重用。
1、定义模版(冲水模版)
public abstract class FlushWaterTemple{
//定义算法骨架
public void flushWater(){
wash();
boilWater();
addMaterial();
finshedWater();
}
public void wash(){
System.out.println("洗杯子");
}
public void boilWater(){
System.out.println("烧水");
}
//加料
public abstract void addMaterial();
//烫材料
public abstract void finshedWater();
}
}
2、冲茶叶
public class FlushTea extends FlushWaterTemple{
//加料
public void addMaterial(){
System.out.println("加点茶叶");
}
//烫材料
public void finshedWater(){
System.out.println("用沸水烫茶叶");
}
}
2、冲咖啡
public class FlushCoffee extends FlushWaterTemple{
//加料
public void addMaterial(){
System.out.println("加点咖啡");
}
//烫材料
public void finshedWater(){
System.out.println("用温水烫咖啡");
}
}
测试
public class Test{
public static void main(){
FlushWaterTemple tmp = new FlushCoffee();
tmp.flushWater();
}
}