参考:1.《图解设计模式》 https://cloud.tencent.com/developer/article/1609361 https://www.jianshu.com/p/800a44c1d9dd https://www.cnblogs.com/jing99/p/12607905.html

模式定义

  • 定义一个操作算法中的框架,而将这些步骤延迟加载到子类中;
  • 其本质就是固定算法框架或者说算法每个部分的执行顺序

    解决何种问题

  • 让父类控制子类方法的调用顺序

  • 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    模式好处

  • 开发人员在开发时,只需要考虑方法的实现。不需要考虑方法在何种情况下被调用。实现代码复用。

    模式适合场景

  • 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。

  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
  • 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。

JDK里的Template Method模式

  • java.io.InputStream 、 java.io.OutputStream 、 java.io.Reader 以及java.io.Writer中所有非抽象方法
  • java.util.AbstractList, java.util.AbstractSet以及java.util.AbstractMap中所有非抽象方法。

代码示例

UML类图如下

TemplateMethod模式.png

  1. public abstract class Game {
  2. /**
  3. * 初始化游戏
  4. */
  5. public abstract void initialize();
  6. /**
  7. * 开始游戏
  8. */
  9. public abstract void startPlay();
  10. /**
  11. * 结束游戏
  12. */
  13. public abstract void endPlay();
  14. /**
  15. * 模板方法:确定了游戏的流程
  16. */
  17. public final void playGame() {
  18. initialize();
  19. startPlay();
  20. endPlay();
  21. }
  22. }
  1. public class BasketBallGame extends Game {
  2. @Override
  3. public void initialize() {
  4. System.out.println("Basketball Game Initialized! Start playing.");
  5. }
  6. @Override
  7. public void startPlay() {
  8. System.out.println("Basketball Game Started. Enjoy the game!");
  9. }
  10. @Override
  11. public void endPlay() {
  12. System.out.println("Basketball Game Finished!");
  13. }
  14. }
  1. public class FootBallGame extends Game {
  2. @Override
  3. public void initialize() {
  4. System.out.println("Football Game Initialized! Start playing.");
  5. }
  6. @Override
  7. public void startPlay() {
  8. System.out.println("Football Game Started. Enjoy the game!");
  9. }
  10. @Override
  11. public void endPlay() {
  12. System.out.println("Football Game Finished!");
  13. }
  14. }
  1. /**
  2. * 测试代码
  3. */
  4. public class Main {
  5. public static void main(String[] args) {
  6. Game basketBallGame = new BasketBallGame();
  7. Game footBallGame = new FootBallGame();
  8. basketBallGame.playGame();
  9. System.out.println();
  10. footBallGame.playGame();
  11. }
  12. }

模式总结

  • 模板方法模式有两个角色:抽象类和具体子类
  • AblstractClass(抽象类):在抽象类中定义了一系列的操作PrimitiveOperation,每个操作可以使具体的,也可以是抽象的,每个操作对应一个算法的步骤,在子类中可以重新定义或实现这些步骤。TmplateMethod()这个方法用于定义一个算法结构,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
  • ConcreteClass(具体子类):用于实现在父类中声明的抽象基本操作,也可以覆盖在父类中已经实现的具体基本操作。