模板设计模式
开闭原则(OCP):一个软件实体如类、模块和函数应该对扩展开放、对修改关闭
模板设计模式是抽象类的一个实际应用场景
咖啡冲泡法:
1.将水煮沸
2.用沸水冲泡咖啡
3.将咖啡倒进杯子
4.加糖和牛奶
茶冲泡法:
1.将水煮沸
2.用沸水浸泡茶叶
3.把茶倒进杯子
4.加柠檬
举例:用代码实现咖啡和茶的类
1.冲泡咖啡类
class Coffee{
public final void makeDrink(){
this.boilWater(); //1.将水煮沸
this.brewCoffee(); //2.用沸水冲泡咖啡
this.pourInCup(); //3.将咖啡倒进杯子
this.addSugerAndMilk(); //4.加糖和牛奶
}
}
public void boilWater(){
System.out.println("1.将水煮沸");
}
public void brewCoffee(){
System.out.println("2.用沸水冲泡咖啡");
}
public void pourInCup(){
System.out.println("3.将咖啡倒进杯子");
}
public void addSugerAndMilk(){
System.out.println("4.加糖和牛奶");
}
2.冲泡茶类
class Tea{
public final void makeDrink(){
this.boilWater();
this.brewTea();
this.pourInCup();
this.addLemon();
}
public void boilWater(){
System.out.println("1.将水煮沸");
}
public void brewTea(){
System.out.println("2.用沸水冲泡茶");
}
public void pourInCup(){
System.out.println("3.把茶倒进杯子");
}
public void addLemon(){
System.out.println("4.加柠檬");
}
}
在上述中,因为茶和咖啡很相似,所以将他们共同的部分抽取出来,放在一个基类中
1.将水煮沸
2.用沸水冲泡饮料
3.把饮料倒进杯子
4.在饮料内加入适当的调料
抽象类基类实现
abstract class Drink{
//被声明为final以免子类改变这个算法的顺序
public final void makeDrink(){
if(this.isHotWater()){ //是否是热水
this.boilWater(); //1.将水煮沸
}
this.brewDrink(); //2.沸水冲泡饮料
this.pourInCup(); //3.倒进杯子
if(this.isAddOther()){ //是否加入其它辅料
this.addOther(); //4.加入其它辅料
}
}
public final void boilWater(){
System.out.println("1.将水煮沸");
}
public final void pourInCup(){
System.out.println("3.倒进杯子");
}
public abstract void brewDrink();
public abstract void addOther();
public boolean isAddOther(){
return false;
}
public boolean isHotWater(){
return true;
}
}
class Coffee extends Drink{
public void brewDrink(){
System.out.println("2.用沸水冲泡咖啡");
}
public void addOther(){
System.out.println("4.加入糖和牛奶");
}
public boolean isAddOther(){
return true;
}
}
class Tea extends Drink{
public void brewDrink(){
System.out.println("2.用沸水冲泡茶");
}
public void addOther(){
System.out.println("4.加入柠檬");
}
public boolean isAddOther(){
return true;
}
public boolean isHotWater(){
return false;
}
}
class Test{
public static void main(String[] args){
Drink coffee = new Coffee();
coffee.makeDrink(); //输出咖啡的过程
System.out.println("-------------");
Drink tea = new Tea();
tea.makeDrink(); //输出茶的过程
}
}
/*
1.将水煮沸
2.用沸水冲泡咖啡
3.倒进杯子
4.加入糖和牛奶
-------------
2.用沸水冲泡茶
3.倒进杯子
4.加入柠檬
*/