1、首先看模板方法的定义:定义一个操作中的算法的骨架,而将一些步骤迟到到子类中。模板方法使得子类可以
不改变一个算法的结构即可重定义该算法的某些特定步骤.
2、模板方法模式结构图:
3、在代码中的表现:
3.1定义一个抽象模板类
/**抽象模板类**/
public abstract class AbstractClass {
/**
* 定义一系列步骤的方法
*/
public void templateMethod(){
commonOperation();
operation1();
operation2();
}
private void commonOperation(){
System.out.println("共同的方法");
}
/**要求子类去实现的方法1**/
protected abstract void operation1();
/**要求子类去实现的方法2**/
protected abstract void operation2();
}
3.2定义第一个具体ConcreteClassA子类
public class ConcreteClassA extends AbstractClass {
@Override
protected void operation1() {
System.out.println("子类A实现的operation1方法");
}
@Override
protected void operation2() {
System.out.println("子类A实现的operation2方法");
}
}
3.3定义第二个具体ConcreteClassB子类
public class ConcreteClassB extends AbstractClass {
@Override
protected void operation1() {
System.out.println("子类B实现的operation1方法");
}
@Override
protected void operation2() {
System.out.println("子类B实现的operation2方法");
}
}
3.4测试类TemplateTest
/**
* 测试类
* @author pylxy
*
*/
public class TemplateTest {
public static void main(String[] args) {
AbstractClass ac = new ConcreteClassA();
ac.templateMethod();
ac = new ConcreteClassB();
ac.templateMethod();
}
}
运行结果:
共同的方法
子类A实现的operation1方法
子类A实现的operation2方法
共同的方法
子类B实现的operation1方法
子类B实现的operation2方法
4、 使用模板方法模式处理DAO中的查询方法
4.1 定义一个AbstractDao类
/**模板类**/
public abstract class AbstractDao {
/**查询的模板方法**/
public Object find(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
ps.setObject(i + 1, args[i]);
rs = ps.executeQuery();
Object obj = null;
if (rs.next()) {
obj = rowMapper(rs);
}
return obj;
} catch (SQLException e) {
} finally {
close(rs, ps, conn);
}
}
//抽象方法让子类去实现
abstract protected Object rowMapper(ResultSet rs) throws SQLException;
}
4.2 定义UserDaoImpl类,同时继承AbstratDao类
public class UserDaoImpl extends AbstractDao {
public User findUser(String username) {
String sql = "select * from user where name=?";
Object[] args = new Object[] { username };
Object user = super.find(sql, args);//调用父类模板方法
return (User) user;
}
//实现让父类去调用的抽象方法
protected Object rowMapper(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getFloat("password"));
user.setBirthday(rs.getDate("birthday"));
return user;
}
}
5、类及方法的对应关系
AbstractDao类------------>AbstractClass 类
UserDaoImpl 子类----------->ConcreteClassA子类
abstract protected Object rowMapper方法----> abstract void operation1方法
这样就实现了不同的Dao类共用一部分代码,有效地实现了代码的复用.