模板模式的核心是定义一个算法的骨架,把一些可能变化的实现延迟到子类中去。工厂方法可以看成是一种特殊的模板模式。
模板模式还与策略模式有点相似,但是他们的侧重点不同,模板模式的侧重点是规定算法模板,让别人按照他的意图去做事,策略模式的侧重点是定义一系列的方法簇,让使用者自己去选择。他们一个占据着主导权,一个交出了主导权
下面我们通过一个榨汁机的例子来看看模板模式是如何实现的
public abstract class Juicer {
Boolean haveIngredients=true;
public final void prepareBeverages(){
addFruit();
juice();
filter();
if(haveIngredients)
addIngredients();
}
//让子类去决定加什么水果
public abstract void addFruit();
public final void juice(){
System.out.println("正在榨汁");
}
public final void filter(){
System.out.println("过滤");
}
//让子类去决定加什么调料
public abstract void addIngredients();
//定义了一个钩子,让用户决定是否加调料
public void setHaveIngredients(Boolean haveIngredients){
this.haveIngredients=haveIngredients;
}
}
public class BananaJuicer extends Juicer{
@Override
public void addFruit() {
System.out.println("加香蕉");
}
@Override
public void addIngredients() {
System.out.println("加冰加糖");
}
}
public class AppleJuicer extends Juicer{
@Override
public void addFruit() {
System.out.println("加苹果");
}
@Override
public void addIngredients() {
System.out.println("加冰");
}
}
写个测试方法
public static void main(String[] args) {
Juicer juicer1=new AppleJuicer();
juicer1.prepareBeverages();
System.out.println("--------------------------------");
Juicer juicer2=new BananaJuicer();
juicer2.haveIngredients=false;
juicer2.prepareBeverages();
}
运行结果:
加苹果
正在榨汁
过滤
加冰
--------------------------------
加香蕉
正在榨汁
过滤
模板模式用钩子的模式可以去改变执行的过程,用final关键字修饰那些不可以修改的方法
模板模式是一种非常常见的模式,他在框架中应用的非常广泛,如果你的项目需要实现一些功能类似的代码,就可以用模板模式。
PS:源码地址