一、模板方法:
定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
二、实践
饭店里面,客人点餐后,后厨烧菜。后厨做菜的整个过程可以认为都是在重复烧菜前准备、烧菜、烧菜后处理这三个步骤,因此我们可以顶一个烧菜的模板,具体的细节延迟到每一道菜做的过程中去实现。
2.1 定义烧菜的模板
//定义模板,烧菜步骤:烧菜前准备工作、烧菜、烧好菜后事项。
//即定义模板类,固定了算法的骨架
public abstract class CookTemplate {
protected void doCook(){
prepareCook();
cook();
postCook();
}
protected abstract void prepareCook();
protected abstract void cook();
protected abstract void postCook();
}
2.2 烧制一到菜 (模板方法的一个实现类)
//继承烧菜算法骨架,烧菜的具体细节延迟在子类中去完成
//青椒炒蛋
public class EggWihtPepper extends CookTemplate {
@Override
protected void prepareCook() {
System.out.println("洗辣椒,切辣椒,搅鸡蛋!");
}
@Override
protected void cook() {
System.out.println("做青椒炒蛋 ing ");
}
@Override
protected void postCook() {
System.out.println("出锅,装盘,端上客人餐桌!");
}
}
2.3 烧个汤 (模板方法的另一个实现类)
public class EggSoup extends CookTemplate {
@Override
protected void prepareCook() {
System.out.println("搅蛋,洗虾米,洗紫菜。");
}
@Override
protected void cook() {
System.out.println("做紫菜蛋汤 ing ");
}
@Override
protected void postCook() {
System.out.println("装汤碗,端上客人餐桌。");
}
}
2.4 客人点菜。(测试类)
public class Test {
public static void main(String[] args) {
System.out.println("客人点了一份鸡蛋汤!");
CookTemplate eggSoup = new EggSoup();
eggSoup.doCook();
System.out.println("----------------------");
System.out.println("客人点了一份青椒炒蛋!");
CookTemplate eggWihtPepper = new EggWihtPepper();
eggWihtPepper.doCook();
}
}
打印结果:
客人点了一份鸡蛋汤!
搅蛋,洗虾米,洗紫菜。
做紫菜蛋汤 ing
装汤碗,端上客人餐桌。
----------------------
客人点了一份青椒炒蛋!
洗辣椒,切辣椒,搅鸡蛋!
做青椒炒蛋 ing
出锅,装盘,端上客人餐桌!