模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
模板方法模式的概念
在模板方法模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
模板方法模式的优点
- 代码复用:模板方法模式在抽象类中提供了一个算法框架,允许子类在不改变算法结构的前提下,通过重定义某些步骤的方式重用该算法。
- 扩展性:新的具体实现只需继承抽象类并实现其抽象方法即可,非常方便。
- 强制标准:算法的框架被预先定义,子类实现时必须遵循该框架,这在一定程度上强制了标准化。
模板方法模式的缺点
- 限制了灵活性:由于模板方法最终调用的是已经在抽象类中定义好的方法,这可能限制了子类的灵活性。
- 增加了系统的复杂性:随着抽象类和具体子类的增多,系统可能变得更加难以理解。
Java代码示例
下面是一个模板方法模式的示例,其中定义了一个抽象类 Game
,它提供了玩游戏的模板方法 play()
,并由其子类实现具体的步骤。
java复制代码
// 抽象类,定义了模板方法和一些基本步骤
abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
// 模板方法
public final void play() {
// 初始化游戏
initialize();
// 开始游戏
startPlay();
// 结束游戏
endPlay();
}
}
// Cricket游戏的具体实现
class Cricket extends Game {
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
}
// Football游戏的具体实现
class Football extends Game {
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
}
// 客户端代码
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
在这个例子中,Game
类定义了一个游戏的基本步骤和模板方法 play()
,而 Cricket
和 Football
类分别实现了这些步骤,提供了各自的游戏实现。这种方式使得算法的结构被保存,而具体的步骤可以有不同的实现。