概述
在模板模式中,存在一个定义了执行某一具体方法的一组抽象方法的抽象类,它的各个子类可以根据需要对抽象方法进行不同的实现。
该模式涉及的角色有:
- 抽象模板角色:定义一个或多个抽象操作;定义并实现一个模板方法,该方法给出了一个大致的逻辑框架,而框架又由一组抽象组成组成,抽象操作的具体实现可以推迟到子类再实现。
- 具体模板角色:实现父类定义的一个或多个抽象方法,这一组方法是逻辑框架的组成步骤。
示例
以一个游戏的过程为例,它大致分为初始化,开始,结束 三个过程,不同类型的游戏中这三个过程的执行方式又是不一样的。
首先定义模板,它描述了一个游戏的大致过程
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)每一组抽象操作的不同实现需要对应的一个子类完成,这会导致子类增加