一、什么是模板设计模式?
在面向对象编程过程中,程序猿们经常会遇到这样的问题:
设计一个系统时,知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未确定,或者说某些步骤的实现与具体环境有关,这些未确定的步骤需要延迟到子类实现。
例如:
去银行办理业务一般需经过以下4个步骤:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。
1.1 模板模式(Template Pattern)的定义
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
1.2 模板模式的结构
模板方法模式包含以下主要角色:
(1) 抽象类:负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下:
① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法
② 基本方法:是整个算法中的一个步骤,包含以下几种类型
- 抽象方法:在抽象类中申明,由具体子类实现
- 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它
- 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种
(2) 具体子类:实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
1.3 模板模式的优缺点
优点:
(1)具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。
(2)代码复用的基本技术,在数据库设计中尤为重要。
(3)存在一种反向的控制结构,通过一个父类调用其子类的操作,通过子类对父类进行扩展增加新的行为,符合“开闭原则”。
缺点:
(1)每个不同的实现都需要定义一个子类,会导致类的个数增加,系统更加庞大。
二、糟糕的JDBC代码
public class Main {
public static void main(String[] args) {
//查询数据
read();
//数据插入
create();
//数据更新
update();
//删除数据
delete();
}
/**
* 查数据
*/
private static void read() {
// 载数据库驱动
loadDBDriver();
String sql = "select name, userid from user where userid > ? order by userid";
Connection connection = null;
PreparedStatement ps = null;
try {
// 创建数据库连接
connection = getConnection();
// 创建语句对象
ps = connection.prepareStatement(sql);
// 绑定参数
ps.setInt(1, 0);
ResultSet rs = ps.executeQuery();
//遍历结果集
while (rs.next()) {
System.out.printf("name: %s id: %d \n",
rs.getString("name"),
rs.getInt("userid"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {