java模板模式与策略模式示例
模板方法简介:
把一些公用的通用的内容抽出来,个性的变动的内容做为参数暴露出来,做为一个模板。在使用时只用传递不同的参数到此模板,便可以得到想要的数据结果,这就是设计模式中得模板方法模式。
下面是使用模板方法来设计dao层的代码示例:
import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * 定义一个抽象的dao父类 * * @author wb_gaobingyin * */abstract class BaseDao {/** * 这里把查询对象时的公用的地方抽出来了,做为查询单个对象的一个模板, * 具体的查询将在这个模板上开展,这种处理的方式就叫做模板方法。 * @param sql * @param args * @return */public Object getObject(String sql, Object[] args) {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 = this.RowMapperMethod(rs);// 这个方法调用的时总会调用子类中实现的具体方法,进行不同的字段与属性的映射}} catch (SQLException e) {e.printStackTrace();} finally {// 释放数据库链接对象}return obj;}public abstract Object RowMapperMethod(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);// 在模板的基础上传入参数,获得想要的结果return user;}/** * 实现基类中的映射方法,不对的实现dao里有不同的装配方式 */public Object RowMapperMethod(ResultSet rs) throws SQLException {User user = new User();user.setUserId(rs.getString("user_id"));user.setUserName(rs.getString("user_name"));user.setAge(rs.getInt("age"));return user;}}class User {private String userId;private String userName;private int age;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
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() {@Overridepublic 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() {@Overridepublic Object mapRows(ResultSet rs) throws SQLException {// TODO Auto-generated method stubreturn rs.getString("user_name");}});return userName;}}class User {private String userId;private String userName;private int age;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}