模板模式(Template Method Pattern)是一种行为设计模式,它在一个方法中定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
主要角色
-
抽象类(Abstract Class):
- 定义了一个或多个抽象方法,用于让子类去实现算法的某些特定步骤。
- 包含一个模板方法(Template Method),该方法定义了算法的骨架,调用了已定义和未定义的步骤(即抽象方法和具体方法)。
-
具体子类(Concrete Subclasses):
- 继承自抽象类,并实现抽象类中定义的抽象方法。
- 可以通过扩展或覆盖父类中的方法来改变算法中特定步骤的行为。
优点
- 代码复用:模板方法定义在抽象类中,子类可以复用这部分代码,无需重复编写。
- 算法结构清晰:模板方法定义了算法的骨架,使得算法结构更加清晰、易于理解。
- 可扩展性:子类可以通过覆盖或扩展模板方法中的特定步骤来改变算法的行为,而无需修改其他部分。
- 符合开闭原则:对扩展开放,对修改关闭。子类可以通过扩展来实现新的功能,而无需修改父类代码。
缺点
- 子类数量增加:每个不同的算法实现都需要一个子类,这可能导致系统中子类数量的增加。
- 控制反转:在模板模式中,子类可能会影响父类的行为,这可能会导致控制反转,使得代码阅读和调试变得更加困难。
应用场景
- 算法框架:当多个类拥有相同的算法框架,但部分步骤有所不同时,可以使用模板模式来定义这个框架,并让子类来实现不同的步骤。
- 生命周期管理:在需要控制对象生命周期的场景中,可以使用模板模式来定义对象的创建、初始化、使用和销毁等步骤,并让子类来实现特定的生命周期行为。
- 框架设计:在框架设计中,可以使用模板模式来定义框架的通用逻辑,并允许用户通过扩展框架来实现特定的业务逻辑。
示例
假设我们有一个游戏框架,其中包含了初始化、开始、进行和结束等步骤。不同的游戏可能需要实现这些步骤的不同行为。我们可以使用模板模式来定义这个框架:
public abstract class Game {// 模板方法,定义了游戏的流程public final void play() {init(); // 初始化start(); // 开始游戏playRound(); // 进行游戏回合end(); // 结束游戏}// 抽象方法,由子类实现protected abstract void init();protected abstract void start();protected abstract void playRound();protected abstract void end();
}// 具体的游戏子类
public class BasketballGame extends Game {@Overrideprotected void init() {System.out.println("篮球游戏初始化成功");}@Overrideprotected void start() {System.out.println("开始打篮球了!");}@Overrideprotected void playRound() {// 实现篮球游戏的回合逻辑}@Overrideprotected void end() {System.out.println("篮球游戏结束");}
}
在这个示例中,Game
抽象类定义了游戏的流程(模板方法play()
),并包含了需要子类实现的抽象方法。BasketballGame
类继承了Game
类,并实现了这些抽象方法,以定义篮球游戏的具体行为。通过调用Game
类的play()
方法,我们可以启动篮球游戏,并自动执行其流程。