1、定义
封装了一个算法的具体步骤,并允许其中的一个或者多个步骤延迟到子类中去实现。模板方法模式可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
2、使用场景
多个子类有公有的方法,并且基本逻辑相似,对于重复的逻辑可以进行抽象封装成模板方法,不同的子类去实现具体的存在差异的相关逻辑。简单来说就是在父类中封装重复的逻辑,存在差异的部分由子类具体实现。
3、UML类图
4、代码实现
/**
* 模板模式:封装算法框架,确定了算法的执行顺序,某些特定的算法由特定子类实现
*
* 定义了冲泡饮料的框架
*/
public abstract class AbstractHotDrink {
/**
* 冲泡热饮
* 封装冲泡的算法步骤
*/
protected final void prepareDrink() {
boilWater();
brew();
pourIntoCup();
//使算法框架不固定,更加灵活
if (isCondimentHook()) {
addCondiment();
} else {
System.out.println("不加调料");
}
}
protected void boilWater() {
System.out.println("烧水");
}
/**
* 冲泡具体的饮料
*/
protected abstract void brew();
/**
* 倒入杯子理
*/
protected void pourIntoCup() {
System.out.println("倒入杯子");
}
/**
* 加入什么调料
*/
protected abstract void addCondiment();
/**
* 是否加入调料
*
* @return
*/
protected boolean isCondimentHook() {
return true;
}
}
/**
* 冲泡咖啡
*/
public class CoffeeImpl extends AbstractHotDrink {
@Override
protected void brew() {
System.out.println("咖啡");
}
@Override
protected void addCondiment() {
System.out.println("加牛奶");
}
}
/**
* 冲泡茶
*/
public class TeaImpl extends AbstractHotDrink {
@Override
protected void brew() {
System.out.println("茶");
}
@Override
protected void addCondiment() {
}
@Override
protected boolean isCondimentHook() {
return false;
}
}
5、总结
与策略模式的区别:
1、模板方法模式封装的算法的执行步骤,策略模式封装的是不同的算法,算法之间没有相互关系,可以进行替换。
2、模板方法模式采用的是继承的方式来实现,策略模式采用的是组合的方式来实现。
优点:封装重复逻辑,具体逻辑有子类来实现,便于维护。
在具体代码的时候,也可以将模板方法模式和策略模式合并在一起使用,具体做法就是对于模板方法模式的需要子类实现的抽象方法抽象成接口,实现接口来提供不同的策略。
代码:https://gitee.com/os2chen/DesignPattern
参考:《Head First Design》、《Android源码设计模式解析与实战》