其实有些设计模式在潜移默化的编码当中你是已经掌握的了,只不过你没系统的去学习设计模式之前你不知道它统一的名称叫什么,统一概念和名词的好处就是减少沟通的成本,并能过滤掉一些小白。
模板方法模式说起来非常简单,本身概念也很容易掌握,就是把通用的代码部分封装好一个模板,方便之后重复利用。
这里还是引用head first中的例子,coffee和tea的制作过程分别是:
coffee
(1)把水煮沸
(2)用沸水冲泡咖啡
(3)把咖啡倒进杯子
(4)加糖和牛奶
tea
(1)把水煮沸
(2)用沸水侵泡茶叶
(3)把茶倒进杯子
(4)加柠檬
代码是这样实现的:
public class Coffee {
void prepareRecipe() {
boilWater();
brewCoffeeGrinds();
pourCup();
addSugarAndMilk();
}
private void addSugarAndMilk() {
System.out.println("addSugarAndMilk");
}
private void pourCup() {
System.out.println("pourCup");
}
private void brewCoffeeGrinds() {
System.out.println("brewCoffeeGrinds");
}
private void boilWater() {
System.out.println("boilWater");
}
}
public class Tea {
void prepareRecipe() {
boilWater();
steepTeaBag();
pourCup();
addLemon();
}
private void boilWater() {
System.out.println("boilWater");
}
private void steepTeaBag(){
System.out.println("steepTeaBag");
}
private void pourCup() {
System.out.println("pourCup");
}
private void addLemon() {
System.out.println("addLemon");
}
}
可以看出整体流程是一致的,(1)(3)操作又是完全的一致,(2)(4)操作是一样只不过应用在不同饮料上
好,看看如何把通用的抽象出来做成一个模板:
public abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
private void boilWater() {
System.out.println("Boiling water");
}
private void pourCup() {
System.out.println("Pouring into cup");
}
}
public class Tea extends CaffeineBeverage{
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding Lemon");
}
}
public class Coffee extends CaffeineBeverage{
@Override
void brew() {
System.out.println("Dripping Coffee through filter");
}
@Override
void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
}
打完一套,收工。。。