模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
白话:在一个抽象类中定义几个抽象方法,在定义一个主方法,主方法中调用抽象方法,外部继承该类,子类按需重写抽象方法,并调用主方法执行,即为模板模式
模板模式的优缺点
- 优点:
a. 封装不变部分,扩展可变部分。
b. 提取公共代码,便于维护。
c. 行为由父类控制,子类实现。 - 缺点:
a. 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
实现
我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。
TemplatePatternDemo,我们的演示类使用 Game 来演示模板模式的用法。
模板代码
1. 创建模板抽象类,并将模板方法设置为final,以防子类重写
/**
* 抽象模板类
*/
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void playEnd();
// 模板方法,设定为final,不可被重写
public final void play() {
// 初始化游戏
initialize();
// 开始玩游戏
startPlay();
// 玩游戏结束
playEnd();
}
}
2. 创建具体实现类,即扩展类
public class BasketballGame extends Game{
@Override
void initialize() {
System.out.println("basketball game initialize success!");
}
@Override
void startPlay() {
System.out.println("start play basketball game");
}
@Override
void playEnd() {
System.out.println("basketball game end");
}
}
public class FootballGame extends Game{
@Override
void initialize() {
System.out.println("football game initialize success!");
}
@Override
void startPlay() {
System.out.println("start play football game");
}
@Override
void playEnd() {
System.out.println("football game end");
}
}
3. 使用Game方法测试
public class TemplatePatternTest {
public static void main(String[] args) {
Game basketballGame = new BasketballGame();
basketballGame.play();
Game footballGame = new FootballGame();
footballGame.play();
}
}
// 输出
// basketball game initialize success!
// start play basketball game
// basketball game end
// football game initialize success!
// start play football game
// football game end