模板方法模式会将模板方法以及不需要随业务场景变化的基本方法放到父类中实现,随业务场景变化的基本方法会被定义为抽象方法,由子类提供真正的实现。
下图展示了模板方法模式的核心类,其中 template() 方法是我们上面描述的模板方法,part1() 方法和 part3() 方法是逻辑不变的基本方法实现,而 part2()、part4() 方法是两个随场景变化的基本方法。
我们可以通过模板方法控制整个流程的走向以及其中固定不变的步骤,子类来实现流程的某些变化细节,这就实现了“变化与不变”的解耦,也实现了“整个流程与单个步骤”的解耦。当业务需要改变流程中某些步骤的具体行为时,直接添加新的子类即可实现,这也非常符合“开放-封闭”原则。另外,模板方法模式能够充分利用面向对象的多态特性,在系统运行时再选择一种具体子类来执行完整的流程,这也从另一个角度提高了系统的灵活性。
示例:
定义模板类
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//前提条件
private void premise() {
System.out.println("When I have free time");
}
public final void play() {
premise();
//初始化游戏
initialize();
//开始游戏
startPlay();
//结束游戏
endPlay();
}
}
public class BasketballGame extends Game {
@Override
void initialize() {
System.out.println("Basketball game initialize...");
}
@Override
void startPlay() {
System.out.println("Basketball Game Started.Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Basketball Game Over!");
}
}
public class FootballGame extends Game {
@Override
void initialize() {
System.out.println("Loading...");
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
}
测试:
public class Test {
public static void main(String[] args) {
Game game = new BasketballGame();
game.play();
System.out.println("==================================");
Game game1 = new FootballGame();
game1.play();
}
}