⏹定义一个制作做菜的模板类
做菜的流程都是固定的,都需要买菜,洗菜,切菜,炒菜等步骤
不管做什么菜都需要上述步骤,最终的步骤都是上菜
我们可以用一个上菜方法将买菜,洗菜,切菜,炒菜等步骤定义为做菜的流程模板
public abstract class CookFood {
// 买菜
public abstract void getGroceries();
// 洗菜
public abstract void clearVegetables();
// 切菜
public abstract void diceVegetables();
// 炒菜
public abstract void cooking();
// 上菜
final public void serveDishes() {
this.getGroceries();
// 如果菜很干净,就不需要洗
if (this.isDirty()) {
this.clearVegetables();
}
this.diceVegetables();
this.cooking();
System.out.println("菜做好了");
};
// 菜是否脏,默认返回true,菜都是需要洗的
protected boolean isDirty() {
return true;
}
}
⏹定义一个做炒西红柿类
public class CookTomato extends CookFood {
// 菜是否脏的标记,默认都是菜都是脏的,需要清洗
private boolean isDirtyFlag = true;
@Override
public void getGroceries() {
System.out.println("买西红柿");
}
@Override
public void clearVegetables() {
System.out.println("洗西红柿");
}
@Override
public void diceVegetables() {
System.out.println("切西红柿");
}
@Override
public void cooking() {
System.out.println("炒西红柿");
}
// 重写判断菜是否脏的方法,指定菜是否脏
@Override
protected boolean isDirty() {
return this.isDirtyFlag;
}
public void setDirtyFlag(boolean dirtyFlag) {
isDirtyFlag = dirtyFlag;
}
}
⏹定义一个做炒白菜类
public class CookCabbage extends CookFood {
// 菜是否脏的标记,默认都是菜都是脏的,需要清洗
private boolean isDirtyFlag = true;
@Override
public void getGroceries() {
System.out.println("买白菜");
}
@Override
public void clearVegetables() {
System.out.println("洗白菜");
}
@Override
public void diceVegetables() {
System.out.println("切白菜");
}
@Override
public void cooking() {
System.out.println("炒白菜");
}
// 重写判断菜是否脏的方法,指定菜是否脏
@Override
protected boolean isDirty() {
return this.isDirtyFlag;
}
public void setDirtyFlag(boolean dirtyFlag) {
isDirtyFlag = dirtyFlag;
}
}
⏹测试
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class Test2 implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// 做西红柿
CookTomato cookTomato = new CookTomato();
cookTomato.serveDishes();
System.out.println("------");
// 做白菜
CookCabbage cookCabbage = new CookCabbage();
// 白菜很干净,不需要洗
cookCabbage.setDirtyFlag(false);
cookCabbage.serveDishes();
}
}