背景
现在餐厅有两个服务员,一个人负责煮茶,一个人负责煮咖啡,步骤如下
煮茶:
1.把水烧开
2.倒入茶叶
3.加水
煮咖啡:
1.把水烧开
2.倒入咖啡
3.加水
不用设计模式的实现
package com.example.designMode.template;
public class Origin {
public static class TeaPerson{
public void makeTea() {
boilWater();
addTea();
pourWater();
}
private void boilWater() {
System.out.println("烧水");
}
private void addTea() {
System.out.println("加入茶叶");
}
private void pourWater() {
System.out.println("倒水");
}
}
public static class CoffeePerson{
public void makeCoffee() {
boilWater();
addCoffee();
pourWater();
}
private void boilWater() {
System.out.println("烧水");
}
private void addCoffee() {
System.out.println("加入咖啡");
}
private void pourWater() {
System.out.println("倒水");
}
}
public static void main(String[] args) {
TeaPerson teaPerson = new TeaPerson();
CoffeePerson coffeePerson = new CoffeePerson();
teaPerson.makeTea();
System.out.println("===============================");
coffeePerson.makeCoffee();
}
}
缺点
从以上步骤中可以看出来,烧水和倒水两个步骤是两个服务员都要做的,没有必要都实现一次。
模板模式实现
package com.example.designMode.template;
public class TemplateMode {
public class Person{}
public interface MakeTemplate{
void boilWater();
void make();
void pourWater();
}
public static abstract class MakeTemplateAbstract implements MakeTemplate{
@Override
public void boilWater() {
System.out.println("烧水");
}
@Override
public void pourWater() {
System.out.println("倒水");
}
public void makeDrink() {
boilWater();
make();
pourWater();
}
}
public static class TeaPerson extends MakeTemplateAbstract{
@Override
public void make() {
System.out.println("加入茶叶");
}
}
public static class CoffeePerson extends MakeTemplateAbstract{
@Override
public void make() {
System.out.println("加入咖啡");
}
}
public static void main(String[] args) {
TeaPerson teaPerson = new TeaPerson();
CoffeePerson coffeePerson = new CoffeePerson();
teaPerson.makeDrink();
System.out.println("===============================");
coffeePerson.makeDrink();
}
}
优点
将烧水和倒水两个步骤抽离到接口和实现类中,具体是煮茶还是煮咖啡,只需要具体实现制作过程,如果以后新来一个服务员,负责煮奶茶,只需要继承模板,实现制作方法就可以。