转载:https://blog.csdn.net/m0_47944994/article/details/127997253
//抽象类(包含模板方法和若干个基本方法)
public abstract class AbstractClass {
//模板方法按照一定顺序执行
public final void cookProcess() {
//第一步:倒油
this.pourOil();
//第二步:热油
this.heatOil();
//第三步:倒蔬菜
this.pourVegetable();
//第四步:倒调味料
this.pourSauce();
//第五步:翻炒
this.fry();
}
//倒油步骤都一样,所以具体实现(具体方法)
public void pourOil() {
System.out.println("倒油");
}
//第二步:热油是一样的,所以直接实现(具体方法)
public void heatOil() {
System.out.println("热油");
}
//第三步:倒蔬菜是不一样的(一个下包菜,一个是下菜心)钩子方法
public abstract void pourVegetable();
//第四步:倒调味料是不一样
public abstract void pourSauce();(钩子方法)
//第五步:翻炒是一样的,所以直接实现(具体方法)
public void fry(){
System.out.println("炒啊炒啊炒到熟啊");
}
}
//具体子类
public class ConcreteClass_BaoCai extends AbstractClass {
@Override
public void pourVegetable() {
System.out.println("下锅的蔬菜是包菜");
}
@Override
public void pourSauce() {
System.out.println("下锅的酱料是辣椒");
}
}
//具体子类
public class ConcreteClass_CaiXin extends AbstractClass {
@Override
public void pourVegetable() {
System.out.println("下锅的蔬菜是菜心");
}
@Override
public void pourSauce() {
System.out.println("下锅的酱料是蒜蓉");
}
}
//测试类
public class Client {
public static void main(String[] args) {
//炒手撕包菜
ConcreteClass_BaoCai baoCai = new ConcreteClass_BaoCai();
baoCai.cookProcess();//调用抽象类的模板方法
//炒蒜蓉菜心
ConcreteClass_CaiXin caiXin = new ConcreteClass_CaiXin();
caiXin.cookProcess();//调用抽象类的模板方法
}
}
运行结果:
倒油
热油
下锅的蔬菜是包菜
下锅的酱料是辣椒
炒啊炒啊炒到熟啊
倒油
热油
下锅的蔬菜是菜心
下锅的酱料是蒜蓉
炒啊炒啊炒到熟啊