public class TemplateDesignPattern{
public static void main(String[] args) {
Drink coffee=new Coffee();
coffee.means();
Drink tea1=new Tea();
tea1.means();
Drink tea2=new Tea(false);
tea2.means();
}
}
abstract class Drink{
public final void means() {
boilWatter();
addMaterial();
pourCup();
if(this.isAddCondiments()) {
addCondiments();
}
}
public void boilWatter() {
System.out.println("1.煮沸水");
}
public abstract void addMaterial();
public abstract void pourCup();
public abstract void addCondiments();
public boolean isAddCondiments() {
return true;
}
}
class Coffee extends Drink{
public void addMaterial() {
System.out.println("2.用沸水冲泡咖啡");
}
public void pourCup() {
System.out.println("3.把泡好的咖啡倒入杯子");
}
public void addCondiments() {
System.out.println("4.加糖和牛奶");
}
}
class Tea extends Drink{
private boolean addCondiments=true;
public Tea() {
}
public Tea(boolean addCondiments) {
this.addCondiments=addCondiments;
}
public void boilWatter() {
super.boilWatter();
System.out.println("1.1水温80度");
}
public void addMaterial() {
System.out.println("2.用沸水冲泡茶叶");
}
public void pourCup() {
System.out.println("3.把泡好的茶倒入杯子");
}
public void addCondiments() {
System.out.println("4.加柠檬");
}
public boolean isAddCondiments() {
return this.addCondiments;
}
}
模板设计模式遵循开闭原则,旨在把一系列有规律的流程归类定义为一个父类,由父类确定一个大体的框架(含有抽象的工作流程),再由诸多子类进行细化实行子类的工作方式;
abstract class Drink{
public final void means() {
boilWatter();
addMaterial();
pourCup();
if(this.isAddCondiments()) {
addCondiments();
}
}
public void boilWatter() {
System.out.println("1.煮沸水");
}
public abstract void addMaterial();
public abstract void pourCup();
public abstract void addCondiments();
public boolean isAddCondiments() {
return true;
}
}
子类对父类的一些抽象方法可利用构造方法可以选择执行或者不执行;
class Tea extends Drink{
private boolean addCondiments=true;
public Tea() {
}
public boolean isAddCondiments() {
return this.addCondiments;
}
}
并且在父类中有一些普通方法子类可以选择要不要覆盖他们,这些方法叫做钩子方法;
通过覆写,子类还可以对父类的统一的方法进行完善.