什么是模板模式?
模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
简单说,模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式。
Java设计模式——模板方法模式【Template Method Pattern】作者:止步前行
简单的说,我要做咖啡,有的咖啡放糖,有的放牛奶,有的啥也不放。但是放调味品之前的操作是一样的,比如清洗咖啡豆,研磨咖啡豆等等操作。
我们怎么在OOP编程中体现出来他们的相同与不同呢?
这时,就可以用到模板模式,主要思想是:
把相同的步骤写在父类当中,不同的步骤成为抽象方法,让不同的子类继承父类后,重写父类的方法。
这就实现了,相同的方法不用动,而不同的方法各自实现的需求。
代码演示
简单的模板模式
父类:
public abstract class Building {
//模板方法:做成final,不让子类去覆盖
final void make(){
step1();
step2();
step3();
step4();
}
void step1(){
System.out.println("画图纸");
}
void step2(){
System.out.println("盖地基");
}
void step3(){
System.out.println("往上搭");
}
// 抽象方法,子类继承后各自重写。
abstract void step4();
}
子类:
public class JingZiTa extends Building{
@Override
void step4() {
System.out.println("搭金塔");
}
}
Main方法:
public class Client {
public static void main(String[] args) {
JingZiTa jingZiTa = new JingZiTa();
jingZiTa.make();
}
}
效果:
这就是搭金字塔的四个步骤。
进阶:带有钩子函数的模板模式
如果我想建个房子,3个步骤就够了,根本不需要第四步。怎么办?
这时,我们定义一个方法,叫做钩子函数,当子类又自定义需求时,就可以重写它。(这个函数不是必须要重写的)
父类:
public abstract class Building {
void make(){
step1();
step2();
step3();
// 进行判断,是否要执行第四步。
if(shouldStep4()){
step4();
}
}
void step1(){
System.out.println("画图纸");
}
void step2(){
System.out.println("盖地基");
}
void step3(){
System.out.println("往上搭");
}
/**
* 钩子函数
* @return 默认开启,执行第四步。
*/
boolean shouldStep4(){
return true;
}
abstract void step4();
}
子类
public class JingZiTa extends Building{
@Override
void step4() {
System.out.println("搭金塔");
}
// 返回false,不执行第四步!
@Override
boolean shouldStep4() {
return false;
}
}
Main方法
public class Client {
public static void main(String[] args) {
JingZiTa jingZiTa = new JingZiTa();
jingZiTa.make();
}
}
效果:
模板模式的优缺点
优点:
- 最大程度的复用代码。
- 既统一了算法,也提供了很大的灵活性。
缺点:
每一个具体实现,都要新增一个类。造成了系统的庞大。