设计模式 23:模板方法模式
定义与目的
- 定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 目的:该模式的主要目的是封装算法的框架,允许子类提供具体的实现细节,而不改变算法的整体结构。
实现示例
假设我们有一个简单的游戏,玩家需要经历一系列的挑战才能通关。我们可以使用模板方法模式来实现这个需求。
// 抽象类 - 游戏
abstract class Game {// 模板方法final void play() {makePreparations();startGame();playGame();endGame();}protected void makePreparations() {System.out.println("Making preparations...");}protected abstract void startGame();protected abstract void playGame();protected void endGame() {System.out.println("Game over!");}
}// 具体类 - 冒险游戏
class AdventureGame extends Game {@Overrideprotected void startGame() {System.out.println("Starting adventure game...");}@Overrideprotected void playGame() {System.out.println("Exploring dungeons, fighting monsters...");}
}// 具体类 - 战略游戏
class StrategyGame extends Game {@Overrideprotected void startGame() {System.out.println("Starting strategy game...");}@Overrideprotected void playGame() {System.out.println("Building structures, training troops...");}
}// 客户端代码
public class Client {public static void main(String[] args) {Game adventureGame = new AdventureGame();Game strategyGame = new StrategyGame();System.out.println("Playing adventure game:");adventureGame.play();System.out.println("\nPlaying strategy game:");strategyGame.play();}
}
使用场景
- 当你需要定义算法的骨架,而将一些步骤留给子类去实现时。
- 当你需要确保一系列方法的调用顺序不变,但允许个别方法的具体实现不同。
- 当你需要在不改变算法结构的情况下重定义算法的某些步骤时。
模板方法模式通过定义算法的骨架,并将一些步骤留给子类去实现,使得子类可以在不改变算法结构的情况下重定义算法的某些步骤。这对于需要确保一系列方法的调用顺序不变,但允许个别方法的具体实现不同的场景非常有用。
小结
模板方法模式是一种常用的行为型模式,它可以帮助你定义算法的骨架,而将一些步骤留给子类去实现。这对于需要确保一系列方法的调用顺序不变,但允许个别方法的具体实现不同的场景非常有用。