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类共用一部分代码,有效地实现了代码的复用.