定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
使用了JAVA的继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写);
其实就是JAVA的继承以及抽象方法、重写覆盖的使用;
注意:为防止恶意操作,一般模板方法都加上 final 关键词
AbstractClass(抽象模板):定义了一个模板方法和若干抽象方法和具体方法,
ConcreteClass(具体模板):继承抽象模板类并实现抽象方法
多个子类有公有的方法,而且逻辑基本相同时.
重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现.
重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,庵后通过函数约束其行为。
我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。
TemplatePatternDemo,我们的演示类使用 Game 来演示模板模式的用法。
它的模板方法被设置为 final。
- public abstract class Game {
- abstract void initialize();
- abstract void startPlay();
- abstract void endPlay();
-
- //模板
- public final void play(){
-
- //初始化游戏
- initialize();
-
- //开始游戏
- startPlay();
-
- //结束游戏
- endPlay();
- }
- }
- public class Cricket extends Game {
-
- @Override
- void endPlay() {
- System.out.println("Cricket Game Finished!");
- }
-
- @Override
- void initialize() {
- System.out.println("Cricket Game Initialized! Start playing.");
- }
-
- @Override
- void startPlay() {
- System.out.println("Cricket Game Started. Enjoy the game!");
- }
- }
- public class Football extends Game {
-
- @Override
- void endPlay() {
- System.out.println("Football Game Finished!");
- }
-
- @Override
- void initialize() {
- System.out.println("Football Game Initialized! Start playing.");
- }
-
- @Override
- void startPlay() {
- System.out.println("Football Game Started. Enjoy the game!");
- }
- }
- public class TemplatePatternDemo {
- public static void main(String[] args) {
-
- Game game = new Cricket();
- game.play();
- System.out.println();
- game = new Football();
- game.play();
- }
- }