文章摘要: 模板方法模式使用总结。
简介
简要说明
- 模板方法模式(Template Method Pattern)是一种行为型设计模式。
- 通过在抽象类中定义一个模板方法来固定算法骨架,并将算法中的某些步骤留给子类实现。
主要功能
- 在一个方法中定义一个算法的骨架,将具体的步骤实现延迟到子类中。
- 通过钩子方法(hook methods)提供对算法步骤的控制,允许子类在不改变结构的情况下重新定义算法的某些步骤。
注意事项
- 为防止恶意操作,模板方法可以被声明为
final,确保它不会被覆盖。 - 模板方法中的步骤可以被声明为
protected,以便子类可以访问。 - 应该仔细设计抽象类,确保其方法对于所有子类都有意义。
适用场景
- 当多个算法步骤相同,只有部分步骤不同,并且这些不同步骤可以被抽象化时。
- 当算法的骨架保持不变,而某些步骤的实现可能需要变化时。
Java 8
案例
// 抽象类,定义了模板方法和基本步骤
abstract class Game {
// 模板方法,定义了算法的骨架
public final void play() {
initialize(); // 初始化游戏
startPlay(); // 开始游戏
endPlay(); // 结束游戏
}
// 基本步骤,由子类实现
protected abstract void initialize();
protected abstract void startPlay();
protected abstract void endPlay();
// 钩子方法,可以被覆盖以提供额外的行为
protected void addExtraFeature() {
// 默认实现,什么也不做
}
}
// 具体子类,实现了抽象类中的基本步骤
class Cricket extends Game {
@Override
protected void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
protected void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
@Override
protected void endPlay() {
System.out.println("Cricket Game Finished!");
}
}
class Football extends Game {
@Override
protected void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
protected void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
@Override
protected void endPlay() {
System.out.println("Football Game Finished!");
}
// 覆盖钩子方法以添加额外功能
@Override
protected void addExtraFeature() {
System.out.println("Extra feature in Football: Penalty Shootout!");
}
}
// 客户端代码,使用模板方法模式
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
Game cricket = new Cricket();
cricket.play();
Game football = new Football();
football.play();
}
}
注释
- 在这个例子中,
Game是一个抽象类,它定义了模板方法play(),这个方法定义了玩游戏的步骤。它调用了三个抽象方法initialize()、startPlay()和endPlay(),这些方法在子类中实现。addExtraFeature()是一个钩子方法,它提供了在子类中添加额外行为的机会。 Cricket和Football是Game的具体子类,它们实现了父类中的抽象方法。Football类还覆盖了钩子方法addExtraFeature()来添加足球游戏特有的额外功能。- 客户端代码创建了
Cricket和Football的实例,并调用它们的play()方法。由于play()方法是模板方法,它确保了游戏的步骤按照预定的顺序执行,同时允许子类自定义具体的实现。