模板方法模式 – 做面条
制作面条抽象类
public abstract class BoiledNoodles {
public final void cook() {
showName();
// 1. 煮开水
this.boiledWater();
// 2. 下面条
this.putNoodles();
// 3. 加鸡蛋
if (needEggs()) {
this.putEggs();
}
// 4. 放调料
this.putSeasoning();
// 5. 开吃
this.eat();
}
protected abstract void showName();
protected final void boiledWater() {
System.out.println("煮开水...");
}
final void putNoodles() {
System.out.println("下面条...");
}
final void putEggs() {
System.out.println("加鸡蛋...");
}
protected boolean needEggs() {
return false;
}
protected abstract void putSeasoning();
private void eat() {
System.out.println("吃面..");
}
}
面条1 – 油泼面
public class OilSplashingNoodles extends BoiledNoodles {
@Override
protected void showName() {
System.out.println("油泼面:");
}
@Override
protected void putSeasoning() {
System.out.println("干辣子、葱花、香菜...");
System.out.println("泼热油...");
}
}
面条2 – 兰州拉面
public class LanZhouPullNoodles extends BoiledNoodles {
@Override
protected void showName() {
System.out.println("兰州拉面:");
}
@Override
protected void putSeasoning() {
System.out.println("葱花、香菜、辣椒油");
}
@Override
protected boolean needEggs() {
return true;
}
}
测试类
public class Test {
public static void main(String[] args) {
BoiledNoodles noodles = new OilSplashingNoodles();
noodles.cook();
System.out.println("------------ 分割线 ------------");
noodles = new LanZhouPullNoodles();
noodles.cook();
}
}
** 运行结果 **
油泼面:
煮开水...
下面条...
干辣子、葱花、香菜...
泼热油...
吃面..
------------ 分割线 ------------
兰州拉面:
煮开水...
下面条...
加鸡蛋...
葱花、香菜、辣椒油
吃面..