设计模式——模板模式

142 阅读2分钟

概述

在模板模式中,存在一个定义了执行某一具体方法的一组抽象方法的抽象类,它的各个子类可以根据需要对抽象方法进行不同的实现。

该模式涉及的角色有:

  • 抽象模板角色:定义一个或多个抽象操作;定义并实现一个模板方法,该方法给出了一个大致的逻辑框架,而框架又由一组抽象组成组成,抽象操作的具体实现可以推迟到子类再实现。
  • 具体模板角色:实现父类定义的一个或多个抽象方法,这一组方法是逻辑框架的组成步骤。

示例

以一个游戏的过程为例,它大致分为初始化,开始,结束 三个过程,不同类型的游戏中这三个过程的执行方式又是不一样的。

首先定义模板,它描述了一个游戏的大致过程

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();
    //大致的逻辑框架
    //一个游戏的运行逻辑框架由初始化,开始,结束三个方法组成。
   public final void play(){
      initialize();
      
      startPlay();
 
      endPlay();
   }
}

创建两个实现类:足球/篮球游戏类

public class BasketBallGame extends Game {
    @Override
    void startPlay() {
        System.out.println("篮球游戏开始运行");
    }

    @Override
    void initialize() {
        System.out.println("篮球游戏界面正在初始化");
    }

    @Override
    void endPlay() {
        System.out.println("篮球游戏结束运行");
    }
}
public class FootBallGame extends Game {
    @Override
    void startPlay() {
        System.out.println("足球游戏开始运行");
    }

    @Override
    void initialize() {
        System.out.println("足球游戏界面正在初始化");
    }

    @Override
    void endPlay() {
        System.out.println("足球游戏结束运行");
    }
}

测试一下:

public class Test {
    public static void main(String[] args) {
        Game bg = new BasketBallGame();
        bg.play();
        Game fg = new FootBallGame();
        fg.play();
    }
}

总结

优点

(1)将抽象模板的方法中分为不变部分和可变部分,它的子类可以扩展可变部分。

(2)提取公共代码(不变部分),便于维护。

缺点

(1)每一组抽象操作的不同实现需要对应的一个子类完成,这会导致子类增加


参考资料

菜鸟教材