目录
开闭原则(OCP): 一个软件实体如类、模块和函数应该对扩展开放、对修改关闭。
开闭原则是Java世界中最基础的设计原则。
模版设计模式是抽象类的一个实际应用场景,讲模板设计模式之前,我们先来看一下星巴克咖啡冲泡师傅的训练手册。
一、星巴克咖啡冲泡法
1. 将水煮沸 2. 用沸水冲泡咖啡 3. 将咖啡倒进杯子 4. 加糖和牛奶
范例:冲泡咖啡类
//一键启动按钮,点这个按钮就可以做出一杯咖啡
public void prepareRecipe(){
boilWater();//烧水
brewCoffeeBag();//把咖啡泡在水中
pourInCup();//把咖啡倒在顾客杯子里
addSugarAndMilk();//添加糖和牛奶
}
private void addSugarAndMilk() {
System.out.println("adding sugar and milk");
}
private void pourInCup() {
System.out.println("pouring coffee into cup");
}
private void brewCoffeeBag() {
System.out.println("brewing coffee bag");
}
private void boilWater() {
System.out.println("boiling water");
}
}
二、星巴克茶冲泡法
1. 将水煮沸 2. 用沸水浸泡茶叶 3. 把茶倒进杯子 4. 加柠檬
范例:冲泡茶类
public void prepareRecipe(){
boilWater();//烧水
steepTeaBag();//将茶包泡在水里
pourInCup();//将泡好的茶倒入顾客杯子
addLemon();//加柠檬
}
private void addLemon() {
System.out.println("adding lemon into tea");
}
private void pourInCup() {
System.out.println("pouring tea into cup");
}
private void steepTeaBag() {
System.out.println("steeping tea bag");
}
private void boilWater() {
System.out.println("boiling water...");
}
}
三、模板设计模式
我们在这两个类中发现了重复代码,因此我们需要重新理一下我们的设计。 既然茶和咖啡是如此的相似,因此我们应该将共同的部分抽取出来,放进一个基类中。
实际上,浸泡(steep)和冲泡(brew)差异并不大。因此我们给它一个新的方法名称brew(),这样我们无论冲泡 的是何种饮料都可以使用这个方法。同样的,加糖、牛奶还是柠檬也很相似,都是在饮料中加入其它调 料,因此我们也给它一个通用名称addCondiments()。重新设计后通用的prepareRecipe()方法如下:
void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
下面我们来分别实现超类(引入"钩子"方法)与子类。
超类实现
public abstra