`

7.java模板模式与8.策略模式示例

阅读更多
模板方法简介:
把一些公用的通用的内容抽出来,个性的变动的内容做为参数暴露出来,做为一个模板。在使用时只用传递不同的参数到此模板,便可以得到想要的数据结果,这就是设计模式中得模板方法模式。

下面是使用模板方法来设计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;
	}






上面dao的设计基础上,假如我现在有一个新的需求,即根据userId仅仅查询出userName,那该如何处理,如何拓展,显然上面的模板已经不能够满足了,是不是需要再写一个模板呢。想想抽模板的过程,是把不变的部分抽出来,而变的部分sql,args做为参数暴露出,装配参数也是变的,所以是用抽象方法让子类去实现。目前的问题就出在装配上,能不能把装配的过程也做为一个参数传递呢?这里就需要用的策略模式了。
策略模式简介:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior) 2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现可任意变化或扩充)  
3、 对客户(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 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;
	}

}

0
1
分享到:
评论

相关推荐

    java设计模式示例

    java设计模式示例 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型...

    深入浅出java设计模式(高清中文PDF)

    文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...

    Java 设计模式详解超详细(含示例代码)

    行为型模式则关注对象的交互和职责分配,包括观察者模式、策略模式、模板方法模式等。 使用设计模式的好处包括: 提高软件的可维护性和可复用性,因为设计模式提供了通用的设计语言和最佳实践。 使代码更易于理解和...

    设计模式-7种开发语言(C#、JAVA、JavaScript、C++、Python、Go、PHP).pdf

    24种设计模式的入门,整合7种开发语言的代码示例。 (C#、JAVA、JavaScript、C++、Python、Go、PHP) 第一节 设计模式:学习顺序 第二节 简单工厂模式 第三节 工厂方法模式 第四节 抽象工厂模式 第五节 单例模式 第...

    design-patterns:带有单元测试的Java设计模式示例

    带有单元测试的Java设计模式示例。 描述 该项目是一个个人库,其中包括一些重要的Java Design Patters,它们使用了漂亮有趣的示例并为每种模式实现了单元测试。 创作模式 单元测试 结构模式 单元测试 适配器 适配器...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.1.2. 在Tomcat 服务器上运行示例.......................................................................................................................... 15 1.1.3. 运行测试..............................

    设计模式精解及面试攻略

    第6章阐释行为模式(职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者模式);第7章针对所有设计模式向初学者提供一些提示;第8章包括常见的面试问题及实际示例;第9章涵盖Java...

    gof-java-design-patterns:Java示例中所有GOF设计模式的存储库

    书中提到的所有设计模式的列表: 现实示例,类图,源代码,适用性,参考等解释的所有设计模式。 设计模式(GOF) 创作模式 结构模式 复合设计模式 装饰器设计模式 立面设计模式 轻量级设计模式 代理设计模式 行为...

    深入浅出设计模式(中文版电子版)

    5.9StrategyPattern(策略模式) 261 5.9.1定义 261 5.9.2现实例子——去机场的策略 263 5.9.3C#实例——排序方法 263 5.9.4Java实例——多格式输出 266 5.9.5优势和缺陷 272 5.9.6应用情景 272 5.10...

    Spring中文帮助文档

    13.12.7. 自定义WebDataBinder初始化 13.13. 更多资源 14. 集成视图技术 14.1. 简介 14.2. JSP和JSTL 14.2.1. 视图解析器 14.2.2. 'Plain-old' JSPs versus JSTL 'Plain-old' JSP与JSTL 14.2.3. 帮助简化开发...

    深入浅出设计模式(中文版)

    5.9StrategyPattern(策略模式) 261 5.9.1定义 261 5.9.2现实例子——去机场的策略 263 5.9.3C#实例——排序方法 263 5.9.4Java实例——多格式输出 266 5.9.5优势和缺陷 272 5.9.6应用情景 272 5.10...

    Spring API

    11.3.7. DataSourceTransactionManager类 11.3.8. NativeJdbcExtractor 11.4. JDBC批量操作 11.4.1. 使用JdbcTemplate进行批量操作 11.4.2. 使用SimpleJdbcTemplate进行批量操作 11.5. 通过使用SimpleJdbc类...

    研磨设计模式-part2

    第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...

    研磨设计模式-part4

    第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...

    研磨设计模式-part3

    第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...

    Struts in Action中文版

    1. 介绍.........................................................................................................18 1.1. 关于本书..........................................................................

    struts in Action

    1. 介绍.........................................................................................................18 1.1. 关于本书...........................................................................

    behavior.zip

    行为型设计模式 模板方法模式代码示例 策略模式代码示例 观察者模式代码示例 责任链模式代码示例 命令模式代码示例

Global site tag (gtag.js) - Google Analytics