模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
举例:
现在有很多体育运动都是计时运动,比如篮球、足球等,都需要在比赛开始时计时,等时间到后停止比赛,但是中间的比赛方式各不相同。展示每种比赛的流程就可以用模板模式来实现。
// 体育运动模板类
public abstract class Sports {
public void start(){
System.out.println("比赛开始,开始计时。");
}
public void end(){
System.out.println("时间到,比赛结束。");
}
public abstract void process();
// 使用final修饰,防止修改模板
public final void play(){
start();
process();
end();
}
}
下面列举两个都需要进行计时的比赛:
public class Basketball extends Sports {
@Override
public void process() {
System.out.println("开始进行篮球比赛");
}
}
public class Football extends Sports {
@Override
public void process() {
System.out.println("开始进行足球比赛");
}
}
主程序:
public class Test {
public static void main(String[] args) {
Sports sports = new Basketball();
sports.play();
System.out.println("=== another sport game ===");
sports = new Football();
sports.play();
}
}
// 运行结果
比赛开始,开始计时。
开始进行篮球比赛
时间到,比赛结束。
=== another sport game ===
比赛开始,开始计时。
开始进行足球比赛
时间到,比赛结束。
总结:
当多个子类有共同的方法,并且有相同的业务逻辑时,可以考虑使用模板模式。
当不变和可变的行为在方法的子类实现中混合在一起时,也可以通过模板模式把这些行为搬移到单一的地方,就可以很好的进行代码的复用。