定义

在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中,使得子类可以在不改变一个算法的结构前提下即可重定义该算法的某些特定步骤。

使用场景

  • 有多个子类共有的方法,且逻辑相同。
  • 重要的、复杂的方法,可以考虑作为模板方法。

    UML

    模板方法模式 - 图1

    角色结构

    优点

  • 封装不变部分,扩展可变部分。

  • 提取公共代码,便于维护。
  • 行为由父类控制,子类实现。

    缺点

    每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

    业务场景

    打不同的游戏流程都是一样的,先打开打开游戏,然后玩游戏,最后结束游戏,但是打游戏的内容是不一样的。

    代码示例

    Game 游戏抽象类

    1. public abstract class Game {
    2. abstract void login();
    3. abstract void startPlay();
    4. abstract void endPlay();
    5. //模板
    6. public final void play(){
    7. //初始化游戏
    8. login();
    9. //开始游戏
    10. startPlay();
    11. //结束游戏
    12. endPlay();
    13. }
    14. }

    LOL 英雄联盟实现类

    1. public class LOL extends Game {
    2. @Override
    3. void endPlay() {
    4. System.out.println("垃圾队友,带不动我,下线");
    5. }
    6. @Override
    7. void login() {
    8. System.out.println("LOL 上号");
    9. }
    10. @Override
    11. void startPlay() {
    12. System.out.println("开心的打晋级赛");
    13. }
    14. }

    DNF 毒奶粉实现类

    1. public class DNF extends Game {
    2. @Override
    3. void endPlay() {
    4. System.out.println("垃圾游戏 又是光头 下线");
    5. }
    6. @Override
    7. void login() {
    8. System.out.println("dnf 上号");
    9. }
    10. @Override
    11. void startPlay() {
    12. System.out.println("开心的刷深渊");
    13. }
    14. }

    Client

    1. public class Client {
    2. public static void main(String[] args) {
    3. Game game = new LOL();
    4. game.play();
    5. System.out.println();
    6. game = new DNF();
    7. game.play();
    8. }
    9. }

    输出

    ```java LOL 上号 开心的打晋级赛 垃圾队友,带不动我,下线

dnf 上号 开心的刷深渊 垃圾游戏 又是光头 下线 ```