模板模式是一种设计模式,用于定义算法骨架,而将一些步骤的具体实现延迟到子类中完成。
举个例子来说,比如制作咖啡和茶的过程就可以使用模板模式来实现。首先我们定义一个抽象类Beverage作为基类,其中包含两个方法:prepareRecipe()和brew()。prepareRecipe()方法负责制作饮品过程中的步骤,brew()方法则是具体的实现。我们在Beverage基类中定义下列几个步骤:
public abstract class Beverage {
final void prepareRecipe() {
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");
}
}
public class Coffee extends Beverage {
void brew() {
System.out.println("Dripping coffee through filter");
}
void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
public class Tea extends Beverage {
void brew() {
System.out.println("Steeping the tea");
}
void addCondiments() {
System.out.println("Adding lemon");
}
}
public class Client {
public static void main(String[] args) {
Beverage tea = new Tea();
tea.prepareRecipe();
Beverage coffee = new Coffee();
coffee.prepareRecipe();
}
}
在JDK中,模板模式的应用非常广泛,以下是一些典型的例子:
1.Collections.sort()方法: 在Java中,我们可以使用Collections.sort()方法对一个集合进行排序。该方法内部实际上调用了List.sort()方法,而List.sort()方法则使用了模板方法的设计模式,它将排序的算法骨架封装在父类中,而具体的排序逻辑则交由子类去实现。
2.HttpServlet.service()方法: 在Java Web开发中,所有的请求都会被Servlet容器转发给HttpServlet类的service()方法处理。该方法就是一个典型的模板方法,其中包含了客户端请求的处理流程,但具体的请求处理逻辑则交由子类去实现。
3.JDBC中的模板方法: 在Java的JDBC API中,PreparedStatement和Statement都实现了execute()方法,该方法是一个典型的模板方法,其中包含了执行SQL语句的流程,但具体的SQL语句则由子类去传入并执行。
4.Spring Framework 中的 JdbcTemplate 类:该类封装了 JDBC 操作,其中的 query() 和 update() 方法使用了模板模式,其中 SQL 语句的执行和结果处理由具体子类实现。