java模板模式与策略模式示例 (二)

2014-11-24 03:14:14 · 作者: · 浏览: 5
客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。

下面是使用策略模式在模板方法之上的dao层改进代码:

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

/**

* 定义一个抽象的dao父类

*

* @author abing

*

*/

class BaseDao {

/**

* 在模板方法的基础上,为getObject方法添加了一个RowMapper[策略接口]接口属性,

* 通过调用方构建不同的RowMapper[策略接口]来完成不同的行为

*

* @param sql

* @param args

* @return

*/

public Object getObject(String sql, Object[] args, RowMapper rm) {

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

Object obj = null;

try {

ps = conn.prepareStatement(sql);

rs = ps.executeQuery();

for (int i = 0; i < args.length; i++) {

ps.setObject(i + 1, args[i]);// 给sql中得参数赋值

}

if (rs.next()) {

obj = rm.mapRows(rs);

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

// 释放数据库链接对象

}

return obj;

}

}

/**

* 定义一个行映射器-[策略接口] 只需要这么一个接口,通过内部类的使用就可以构建不同的方法实现体,来完成不同的事情

*

* @author abing

*

*/

interface RowMapper {

public Object mapRows(ResultSet rs) throws SQLException;

}

class UserDaoImpl extends BaseDao {

/**

* 根据id查询user对象

*

* @return User

*/

public User getUser() {

String sql = "select user_id,user_name,age from uset_tbl where user_id= ";

Object[] args = new Object[] { "abing" };

// 这里使用匿名内部类

User user = (User) this.getObject(sql, args, new RowMapper() {

@Override

public Object mapRows(ResultSet rs) throws SQLException {

// 构建并且返回user对象,这是一种策略

User user = new User();

user.setUserId(rs.getString("user_id"));

user.setUserName(rs.getString("user_name"));

user.setAge(rs.getInt("age"));

return user;

}

});

return user;

}

/**

* 根据id查询userName属性

*

* @return User

*/

public String getUserName() {

String sql = "select user_id,user_name,age from uset_tbl where user_id= ";

Object[] args = new Object[] { "abing" };

// 构建且仅返回userName字符串对象,这也是一种策略

String userName = (String) this.getObject(sql, args, new RowMapper() {

@Override

public Object mapRows(ResultSet rs) throws SQLException {

// TODO Auto-generated method stub

return rs.getString("user_name");

}

});

return userName;

}

}

class User {

private String userId;

private String userName;

private int age;

public String getUserId() {

return userId;

}

public void s