目录
模板模式的理解
模板模式简单理解就是创建一个抽象父类作为模板。可以分两部分,一部分是定义了所有子类都需要执行的公共方法,这样就不用在每个子类中重复写相同代码。另一部分就是强制规定每个子类都要去实现的抽象方法,此处就起到了模板的作用,继承的子类就必须在各自类中去实现对应的方法来完成自己的特有的逻辑。
使用模板模式的例子
定义一个奶茶店的类用于制作奶茶,只做奶茶的步骤分为准备杯子,加牛奶等
public class MilkTeaStore {
public void makeMilkTea(){
System.out.println("准备杯子");
first();
second();
System.out.println("奶茶制作完毕");
}
private void first(){
System.out.println("加牛奶");
}
private void second(){
System.out.println("加茶");
}
}
......
public static void main(String[] args) {
MilkTeaStore store = new MilkTeaStore();
store.makeMilkTea();
}
......
准备杯子
加牛奶
加茶
奶茶制作完毕
但是现在需要开多家基于本奶茶店的分店,如草莓奶茶店,芒果奶茶店等。这些分店可以继承奶茶店父类,然后重写奶茶店制作奶茶的方法makeMilkTea()来制作奶茶,在重写方法中可以加入各自需要加料的步骤,但是对于重写来说,分店就可以随意打乱制作步骤,这与主店相对分离,根本不用遵守主店的标准跟制度要求,导致分店管理混乱。于是主店决定制定规则跟要求,所有的分店在奶茶制作流程上必须跟主店一致,各分店只需要负责具体加料的步骤就好。
public abstract class MilkTeaStore {
//加final防止被子类重写
public final void makeMilkTea(){
System.out.println("准备杯子");
first();
second();
//不同的店加不同的水果
addFruit();
System.out.println("奶茶制作完毕");
}
private void first(){
System.out.println("加牛奶");
}
private void second(){
System.out.println("加茶");
}
//新增抽象方法 子类必须实现
abstract void addFruit();
}
修改奶茶店类作为抽象父类作为模板,所有子类只需要调用makeMilkTea()即可不需要重写,也不能重写,保证制作流程跟父类一致。新增抽象方法addFruit(),各子类继承后必须重写该方法,作为分店独自的加料步骤。
public class StrawBerryMilkTeaStore extends MilkTeaStore {
@Override
void addFruit() {
System.out.println("加入草莓");
}
}
public class MongoMilkTeaStore extends MilkTeaStore {
@Override
void addFruit() {
System.out.println("加入芒果");
}
}
public static void main(String[] args) {
//走到了草莓奶茶店 想买一杯草莓奶茶
StrawBerryMilkTeaStore strawBerryStore = new StrawBerryMilkTeaStore();
strawBerryStore.makeMilkTea();
System.out.println("===============");
//走到了芒果奶茶店 想买一杯芒果奶茶
MongoMilkTeaStore mongoStore = new MongoMilkTeaStore();
mongoStore.makeMilkTea();
}
于是可以看到,各自类统一调用抽象父类的制作主流程,在主流程中又去调用自己重写的加料步骤。这就是模板的作用,统一抽取方法,规定了子类必须实现的方法。
准备杯子
加牛奶
加茶
加入草莓
奶茶制作完毕
===============
准备杯子
加牛奶
加茶
加入芒果
奶茶制作完毕Process finished with exit code 0
此时如果我想要开一家不加任何料的奶茶店,由于原始奶茶店被改造成抽象类,所以不能实例化,故可以创建加料方法为空的子类来实现。
整合工厂模式
(待补充)