1、概述
模板模式是一种基于继承的设计模式,它定义了一个算法的骨架,将某些步骤推迟到子类中实现。
在模板模式中,有两种角色:
抽象类(Abstract Class): 定义了算法的框架,包括一个或多个方法,其中的某些方法由子类实现。
具体类(Concrete Class): 实现了抽象类中的具体方法,完成算法的各个步骤。
2、优缺点
优点
代码复用: 模板模式通过将通用步骤放在抽象类中,避免了代码的重复实现,提高了代码的可维护性和可复用性。
一致性: 定义了算法的骨架,确保所有子类按照相同的模板执行算法,保持了一致性。
灵活性: 具体步骤延迟到子类实现,使得子类可以灵活地重新定义特定步骤的实现。
缺点
过度抽象: 如果抽象类中的算法骨架过于复杂,可能导致子类实现时需要重写的方法过多,增加了子类的复杂性。
不适用于所有情况: 模板模式可能不适用于所有算法,特别是那些具有不同执行顺序的算法。
3、实现方式
public class Test {
public static void main(String[] args) {
BeverageTemplate coffee = new Coffee();
coffee.prepareBeverage();
BeverageTemplate tea = new Tea();
tea.prepareBeverage();
}
}
public abstract class BeverageTemplate {
// 准备饮料
final void prepareBeverage() {
// 准备开水
boilWater();
// 煮
brew();
// 倒进杯子
pourInCup();
// 添加调味品
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("Boiling water");
}
void pourInCup() {
System.out.println("Pouring into cup");
}
}
class Coffee extends BeverageTemplate {
@Override
void brew() {
System.out.println("Brewing coffee grounds");
}
@Override
void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
class Tea extends BeverageTemplate {
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding lemon");
}
}
4、应用场景
算法框架固定,但具体步骤可能有变化
代码复用: 当多个类有相似的行为,但其中一些细节不同,可以将这些共同的行为放在一个抽象类的模板方法中,从而避免代码的重复。
框架设计: 在框架设计中,模板模式经常用于定义框架的骨架和流程。框架提供一个可扩展的基础结构,而具体的实现细节由框架的用户通过继承和实现抽象方法来完成。
生命周期管理: 在对象的生命周期管理中,例如资源的打开和关闭、初始化和清理等过程,模板模式可以确保这些过程按照一定的顺序执行,提高了系统的稳定性。
GUI应用中的事件处理: 在图形用户界面(GUI)应用程序中,事件处理往往遵循一定的模式,例如用户点击按钮后的一系列操作。模板模式可以用于定义事件处理的框架,具体的事件处理则由子类完成。
数据库操作: 在数据库操作中,诸如打开数据库连接、执行SQL语句、关闭连接等过程具有相似的结构。通过模板模式,可以将这些步骤放在抽象类中,而具体的数据库操作由子类完成。
游戏开发中的角色行为: 在游戏开发中,不同角色可能有相似的行为,例如攻击、防御、移动等。使用模板模式可以将这些行为的框架放在抽象类中,而具体的实现由具体角色类完成。