模板方法模式是什么?
模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法模式解决什么问题?
现有冲泡coffee和tea的类:
public class coffee {
void prepare() {
boilWater();
brewCoffee();
pourInCup();
addSugarAndMilk();
}
private void boilWater() {
System.out.println("烧水");
}
private void brewCoffee() {
System.out.println("煮咖啡");
}
private void pourInCup() {
System.out.println("倒入杯子");
}
private void addSugarAndMilk() {
System.out.println("加糖和牛奶");
}
}
class tea {
void prepare() {
boilWater();
brewTea();
pourInCup();
}
private void boilWater() {
System.out.println("烧水");
}
private void brewTea() {
System.out.println("煮茶");
}
private void pourInCup() {
System.out.println("倒入杯子");
}
}
- program1:两者基本步骤类似,代码冗余
模板方法模式实现
新建抽象类Beverage,实现共有方法,子类实现其特定方法,通过方法needCondiments()影响模板方法的内部流程:
abstract class Beverage {
final void prepare() {
boilWater();
brew();
pourInCup();
if (needCondiments()) {
addCondiments();
}
}
private void boilWater() {
System.out.println("烧水");
}
protected abstract void brew();
private void pourInCup() {
System.out.println("倒入杯子");
}
protected abstract void addCondiments();
protected boolean needCondiments() {
return true;
}
}
class Tea extends Beverage {
@Override
protected void brew() {
System.out.println("煮茶");
}
@Override
protected void addCondiments() {
}
@Override
protected boolean needCondiments() {
return false;
}
}
class coffee extends Beverage {
@Override
protected void brew() {
System.out.println("煮咖啡");
}
@Override
protected void addCondiments() {
System.out.println("加糖和牛奶");
}
}