模板方法模式在项目中的应用


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

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值