一、介绍
模板方法模式,顾名思义在这种模式中,为实现某个功能方法调用流程提供了一种模板,调用流程在模板中是既定好的,外部不需要关心流程上的调用过程,也不能去随意的更改模板中定好的东西,为了系统有更好的拓展,模板中定义的方法的具体实现需要子类去完成。
二、UML类图

有这样一个例子,奶茶店里制作奶茶的步骤都一样,只是添加的配料存在差异,添加不同的配料得到不同品类的奶茶。定义一个抽象类AbstractMilkTea,将只做奶茶相同的步骤抽象出来,包括addMilk()、addTea()、addWater()、addComdiment()其中前三个不管做什么品类的奶茶都是固定,这些方法可以在抽象类里直接实现,最后一个加配料的方法就需要子类去实现。
三、代码实例
public abstract class AbstractMilkTea {
//模板中不需要子类覆盖的方法用final修饰
final void make(){
addMilk();
addTea();
addWater();
addCondiment();
}
private void addMilk(){
System.out.println("添加牛奶");
}
private void addTea(){
System.out.println("添加茶水");
}
private void addWater(){
System.out.println("添加清水");
}
abstract void addCondiment();
}
public class PearlMilkTea extends AbstractMilkTea{
@Override
void addCondiment() {
System.out.println("添加珍珠");
}
}
public class CoconutMilkTea extends AbstractMilkTea{
@Override
void addCondiment() {
System.out.println("添加椰果");
}
}
public class Main {
public static void main(String[] args) {
PearlMilkTea pearlMilkTea = new PearlMilkTea();
pearlMilkTea.make();
System.out.println("********************");
CoconutMilkTea coconutMilkTea = new CoconutMilkTea();
coconutMilkTea.make();
}
}

代码中主要注意的一点就是模板中不需要外部或子类去覆盖修改的方法或变量要用final或者private修饰。
四、总结
模板方法模式适用于大部分步骤调用或实现是一样的,只有个别变量需要修改从来产生不同的结果这种场景, 这样大大提高了代码复用,但同时也因为不同的结果都需要一个子类去实现方法使得子类变多,系统变得复杂。
网友评论