定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
OO原则:别找我,我会找你。
代码:
算法骨架类
/**
* 做饭步骤
* @author z_hh
* @time 2018年7月22日
*/
public abstract class CookingStep {
// 定义步骤,用final修饰,杜绝子类覆盖
protected final void cooking() {
wash();// 洗菜
cut();// 切菜
fire();// 开关
spice();// 调料
}
// 洗菜,不提供实现,强制子类实现
protected abstract void wash();
// 切菜,不提供实现,强制子类实现
protected abstract void cut();
// 开火只有一种没啥特别的,用final修饰,杜绝子类覆盖
private final void fire() {
System.out.println("开火!");
}
// 钩子方法,提供默认,子类自己选择是否需要覆盖
protected void spice() {
System.out.println("默认只放盐和油!");
}
}
两个子类
public class ZhouCooking extends CookingStep {
@Override
protected void wash() {
System.out.println("使用挖掘机洗菜!");
}
@Override
protected void cut() {
System.out.println("周师傅用神乎其神的刀法切菜!");
}
@Override
protected void spice() {
System.out.println("我放了盐和油,还有最爱的老干妈!");
}
}
public class WuCooking extends CookingStep {
@Override
protected void wash() {
System.out.println("落后的洗菜手法!");
}
@Override
protected void cut() {
System.out.println("切菜用了半个小时!");
}
}
测试:
public class Test {
public static void main(String[] args) {
// 吴师傅下厨
System.out.println("吴师傅做菜...");
CookingStep wu = new WuCooking();
wu.cooking();
System.out.println("--------------完美分割线--------------");
// 周师傅下厨
System.out.println("周师傅下厨...");
CookingStep zhou = new ZhouCooking();
zhou.cooking();
}
}
结果:
吴师傅做菜...
落后的洗菜手法!
切菜用了半个小时!
开火!
默认只放盐和油!
--------------完美分割线--------------
周师傅下厨...
使用挖掘机洗菜!
周师傅用神乎其神的刀法切菜!
开火!
我放了盐和油,还有最爱的老干妈!