1.模版方法模式简介
模版方法模式(Template Method Pattern)是行为型(Behavioral)设计模式,使用了Java的继承机制,在抽象类里定义了模版方法,该模版方法调用了若干抽象方法(子类实现)或具体方法(子类可覆盖);并迫使子类实现抽象方法,从而实现其余的逻辑。
模版方法的用意在于,把相同的部分放在抽象基类中实现,把变化的部分延迟到子类中实现,不同的子类可以以不同的方式实现抽象方法,达到代码复用的目的。
模版方法模式一共有两种角色:
AbstractClass(抽象类): 抽象类里定义了模版方法,模版方法定义了算法的框架(步骤),包括一系列基本操作;这些基本操作可以是抽象的(由子类实现),也可以是具体的。
ConcreteClass(具体子类): 是抽象类的子类,用于实现在父类中声明的抽象基本操作,也可以覆盖父类中已经实现的具体基本操作。
2. 模版方法模式举例
当使用JDBC操作数据库的时候,通常会有以下步骤:
- 加载驱动
- 打开连接
- 创建Statement
- 执行SQL
- 关闭Statement和连接
每次对数据做操作相同的部分都有加载驱动、打开连接、创建Statement、关闭Statement和连接,差别的部分仅在执行SQL部分,因此非常适用于使用模版方法模式。下面我们就根据这个场景,模拟举例。
序号 | 类名 | 角色 | 说明 |
---|---|---|---|
1 | AbstractTemplate | AbstractClass | 定义了模版方法的抽象类 |
2 | ConcreteTemplate | ConcreteClass | 具体子类,实现了父类的抽象方法 |
3 | TemplateMain | 客户端 | 演示调用 |
AbstractTemplate类中的execute()就是模版方法,它定义了一个算法框架,包括了openConnection、doQuery、closeConnection等基本操作,其中doQuery是抽象的。ConcreteTemplate继承自AbstractTemplate,实现了doQuery方法。
1. 抽象模版类。
/**
* 抽象模版类
*/
public abstract class AbstractTemplate {
private void openConnection(){
System.out.println("打开连接");
}
// 模版方法
public final void execute(){
openConnection();
doQuery();
closeConnection();
}
// 抽象方法
protected abstract void doQuery();
private void closeConnection(){
System.out.println("关闭连接");
}
}
2.具体模版类
/**
* 具体模版类
*/
public class ConcreteTemplate extends AbstractTemplate {
protected void doQuery() {
System.out.println("执行查询");
}
}
3.演示调用
public class TemplateMain {
public static void main(String[] args) {
AbstractTemplate template = new ConcreteTemplate();
template.execute();
}
}
结果输出:
打开连接
执行查询
关闭连接
3. 总结
模版方法模式是一种通过类继承的方式、实现代码复用的技术,把公共行为放在父类中,而通过不同的子类来实现不同的行为。
除了JDBC操作数据,在JMS或者MQ的操作时,同样也可以用到模版方法。此外,Servlet中也有模版方法的影子,我们在写Servlet的时候,通常都会继承自HttpServlet,只需要覆盖其doGet()和doPost()即可;Servlet公共的行为都已经在HttpServlet中实现了。
(完)