模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将该算法中不同的步骤延迟到子类中实现。模板方法模式使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。模板方法模式中包含两个角色:抽象类和具体类。抽象类中定义了一个模板方法,该方法包含了算法的骨架和一些基本方法,基本方法可以是抽象方法、具体方法和钩子方法。具体类继承抽象类并实现基本方法,从而完成算法中的具体步骤。模板方法模式的优点在于它提供了一种代码复用的方式,将算法的结构和具体实现分离开来,使得算法结构更加稳定,具体实现更加灵活。同时它也遵循了开闭原则,即对扩展开放,对修改关闭,当需要修改算法时,只需要修改具体类中的方法即可,而不需要修改抽象类和其他具体类。
// 创建一个抽象类
public abstract class Game {
abstract void start();
abstract void play();
abstract void end();
// 模板方法
public final void playGame() {
start();
play();
end();
}
}
// 创建具体类
public class Football extends Game {
@Override
void start() {
System.out.println("Football game started. Enjoy!");
}
@Override
void play() {
System.out.println("Playing football...");
}
@Override
void end() {
System.out.println("Football game ended. Goodbye!");
}
}
public class Cricket extends Game {
@Override
void start() {
System.out.println("Cricket game started. Enjoy!");
}
@Override
void play() {
System.out.println("Playing cricket...");
}
@Override
void end() {
System.out.println("Cricket game ended. Goodbye!");
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
Game football = new Football();
football.playGame(); // 输出: Football game started. Enjoy! Playing football... Football game ended. Goodbye!
Game cricket = new Cricket();
cricket.playGame(); // 输出: Cricket game started. Enjoy! Playing cricket... Cricket game ended. Goodbye!
}
}
在上面的示例中,Game是一个抽象类,它定义了一个模板方法playGame(),这个方法包含了一个算法框架,其中start()、play()和end()是抽象方法,由具体子类实现。Football和Cricket是Game的具体子类,它们实现了start()、play()和end()方法,并输出相应的信息。在客户端代码Main中,我们创建了一个Football对象和一个Cricket对象,并分别调用它们的playGame()方法,从而运行了它们的算法框架。这样我们就使用了模板方法模式来实现游戏中的算法框架。