1.模板方法定义
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
2.模板方法的类图
如图,一个简单的汽车实例。实例的代码如下:
定义一个汽车抽象模型的类。
public abstract class CarModel {
public abstract void start(); //发动
public abstract void stop(); //停止
public abstract void alarm(); //轰鸣
public abstract void engineBoom();
/*如果定义成抽象类,子类继承中要实现方法。每个汽车都要同样的运行方法.代码重复,
所以定义在抽象类中非抽象方法。 */
final public void run(){ //用final修饰防止子类进行更改。
this.start();
this.stop();
this.alarm();
this.engineBoom();
};
}
用两个具体的汽车来继承汽车模型,代码如下:
public class Car1 extends CarModel{
public void start() {
System.out.println("H1启动");
}
public void stop() {
System.out.println("H1停止");
}
public void alarm() {
System.out.println("H1鸣笛");
}
public void engineBoom() {
System.out.println("H1发动机轰鸣");
}
}
public class Car2 extends CarModel{
public void start() {
System.out.println("H2启动");
}
public void stop() {
System.out.println("H2停止");
}
public void alarm() {
System.out.println("H2鸣笛");
}
public void engineBoom() {
System.out.println("H2发动机轰鸣");
}
}
public static void main(String[] args) throws IOException {
Car1 c1 = new Car1();
c1.run();
}
H1启动
H1停止
H1鸣笛
H1发动机轰鸣
用测试类测试下,可以直接拿来用,这就是一个简单的模板方法。
3.模板方法典型的应用实例
public class JDBCDemo5 {
public static void main(String[] args) {
Connection conn = null;
try {
conn = DBUtil.getConnection();
Statement state = conn.createStatement();
String sql = "SELECT id,username,password,email,account " +
"FROM userinfo_fancq";
ResultSet rs = state.executeQuery(sql);
/*
* 通过结果集获取元数据
*/
ResultSetMetaData rsmd = rs.getMetaData();
/*
* 通过元数据查看结果集中总共有多少个字段?
*/
int colCount = rsmd.getColumnCount();
for(int i=1;i<=colCount;i++){
String colName = rsmd.getColumnName(i);
System.out.println(colName);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
上面的典型案例分析:
1. 获取数据库连接(不可变)
2. 执行sql语句(不可变)
3. 查询出来的字段(根据sql语句可变)
4. 处理异常(不可变)
5. 关闭连接释放资源(不可变)
用模板方式的代码结构如下:
public abstract class JdbcTemplate {
private Connection con;
private Statement state;
@Autowired
private DataSource dataSource;
private ResultSet resultSet;
private ResultSetMetaData data;
public void getStatement(String sql) throws SQLException{
con = dataSource.getConnection();
state = con.createStatement();
resultSet = state.executeQuery(sql);
}
private void releaseResources() throws SQLException {
if (resultSet != null)
resultSet.close();
if (state != null)
state.close();
if (con != null)
con.close();
}
protected abstract void getColumn(ResultSet resultSet) throws SQLException;
public final void getOperation(String sql)throws SQLException{
getStatement(sql);
releaseResources();
getColumn(resultSet);
}
}
public class JdbcCreateEntity extends JdbcTemplate{
@Override
protected void getColumn(ResultSet resultSet) throws SQLException {
/*
* 通过结果集获取元数据
*/
ResultSetMetaData rsmd = resultSet.getMetaData();
/*
* 通过元数据查看结果集中总共有多少个字段?
*/
int colCount = rsmd.getColumnCount();
for(int i=1;i<=colCount;i++){
String colName = rsmd.getColumnName(i);
System.out.println(colName);
}
}
}
jdbc一个简单的模板模式。仅供方便理解。
4.模板方法的优点和缺点
1、优点
(1)、算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改。
(2)、实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
(3)、既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
(4)、提供了一个基本框架,容易扩展子类。模板方法有框架控制如何做事情,而由使用框架的人指定框架算法中每个步骤的细节。子类只要继承父类,实现抽象方法,就可以使用父类的算法。
2、缺点
(1)、模板方法使用继承方式复用代码,如果要在基本算法里面增加一个步骤,而该步骤是抽象的话,每个子类都要修改代码,实现这个步骤。