模板方法模式
1 概述
- 模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。模板方法模式使得子类可以在保留算法整体结构的情况下,灵活地扩展或修改算法的某些部分。
- 这种模式通过一个抽象类来定义算法的骨架,具体步骤的实现则由子类提供,从而实现了算法的复用和扩展。
2 优缺点及应用场景
2.1 优点
- 1)代码复用:将相同的代码放在抽象类中,避免重复,增强代码复用性。
- 2)灵活性:子类可以通过扩展或修改模板方法中的步骤,来实现特定的行为。
- 3)易于维护:算法的主干在一个地方定义,子类仅需重写具体步骤,便于维护和扩展。
2.2 缺点
- 1)增加类的数量:需要创建多个子类来实现不同的行为,可能会增加系统的复杂性。
- 2)继承关系限制:模板方法模式基于继承关系,子类必须继承抽象类,可能会限制某些灵活性。
2.3 应用场景
- 1)算法骨架固定:算法的整体流程是固定的,但某些步骤是可变的情况。
- 2)复用算法代码:多个子类共享相同的算法结构,但在某些步骤上有所不同的情况。
- 3)行为扩展:需要在不修改算法整体结构的前提下,通过子类来扩展或修改算法的某些步骤。
3 结构
- 1)抽象类(AbstractClass):定义算法的骨架,并声明一些抽象的基本方法,供子类实现。
- 2)具体类(ConcreteClass):实现抽象类中定义的抽象方法,从而完成具体的算法步骤。
4 实现
4.1 UML 类图

4.2 代码示例
abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
public final void play() {
initialize();
startPlay();
endPlay();
}
}
class Cricket extends Game {
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
}
class Football extends Game {
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
}
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!
Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!
5 总结
- 模板方法模式通过定义一个算法的骨架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤,实现了代码复用和行为扩展。模板方法模式适用于算法整体流程固定,但某些步骤可变的情况,通过继承和多态实现具体步骤的灵活性。尽管模板方法模式增加了类的数量,但它在复用算法代码和易于维护方面具有显著优势。在实际应用中,需要根据具体需求合理使用模板方法模式,以实现灵活可扩展的系统设计。