- 浏览: 346358 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (160)
- webservice (2)
- 数据库开发 (9)
- LINUX (6)
- 团队协作 (5)
- 前端技术 (4)
- J2EE (31)
- web服务器 (9)
- 经验常识 (13)
- 开发工具 (17)
- 项目管理 (7)
- 重构与设计模式 (8)
- 安全技术 (1)
- 并发编程 (1)
- 移动互联网 (2)
- 编码风格 (1)
- 领域建模 (1)
- 随想杂记 (12)
- 翻译 (2)
- 问题排查 (2)
- 数据挖掘 (4)
- 软件架构 (1)
- java语言基础知识 (13)
- 文件读写 (1)
- mac研发笔记 (1)
- 网络问题 (1)
- python学习 (0)
- Java8新特性 (1)
- soft kes collections (1)
最新评论
-
cremains:
...
java8新特性学习笔记 -
bingyingao:
guooo 写道很好的总结,不知能否转载?可以,多谢关注
又四年了,再看如何快速融入一个新团队 -
guooo:
很好的总结,不知能否转载?
又四年了,再看如何快速融入一个新团队 -
omeweb:
又过了好几年了,有啥新感悟没有?
两年已过去,再看该如何快速融入新团队 -
kely39:
感谢楼主,问题已解决
包冲突问题的解决方法
模板方法简介:
把一些公用的通用的内容抽出来,个性的变动的内容做为参数暴露出来,做为一个模板。在使用时只用传递不同的参数到此模板,便可以得到想要的数据结果,这就是设计模式中得模板方法模式。
下面是使用模板方法来设计dao层的代码示例:
上面dao的设计基础上,假如我现在有一个新的需求,即根据userId仅仅查询出userName,那该如何处理,如何拓展,显然上面的模板已经不能够满足了,是不是需要再写一个模板呢。想想抽模板的过程,是把不变的部分抽出来,而变的部分sql,args做为参数暴露出,装配参数也是变的,所以是用抽象方法让子类去实现。目前的问题就出在装配上,能不能把装配的过程也做为一个参数传递呢?这里就需要用的策略模式了。
策略模式简介:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior) 2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现可任意变化或扩充)
3、 对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。
下面是使用策略模式在模板方法之上的dao层改进代码:
把一些公用的通用的内容抽出来,个性的变动的内容做为参数暴露出来,做为一个模板。在使用时只用传递不同的参数到此模板,便可以得到想要的数据结果,这就是设计模式中得模板方法模式。
下面是使用模板方法来设计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; } }
- template与strategy模式.rar (2.7 KB)
- 下载次数: 15
发表评论
-
降低代码复杂度的一些点
2014-05-23 17:59 2335合理使用以下方案,可降低系统的代码复杂度,遵循程序设计的开闭原 ... -
23设计模式-享元模式
2012-11-13 18:55 0作用:共享对象,节省内存 package com; ... -
22设计模式-访问者模式
2012-10-31 17:06 022设计模式-访问者模式 22设计模式-访问者模式 -
21设计模式-中介者模式
2012-10-31 09:42 823中介者模式 中介模式封装一系列的对象交互,集中管理相关对象之间 ... -
20设计模式-迭代器模式
2012-10-28 11:21 0迭代器模式: 提供一种方法顺序一个聚合对象中各个元素,而又不暴 ... -
19设计模式-解释器模式
2012-10-28 11:19 0解释器模式 某一特定领域的问题比较复杂,类似的模式不断重复出现 ... -
18设计模式-桥接模式
2012-10-28 11:19 0桥接模式 将抽象部分与实现部分分离,使它们都可以独立的变化。 ... -
17设计模式-状态模式
2012-10-25 19:05 0状态模式 当一个对象的内在状态改变时允许改变其行为,这个对 ... -
16设计模式-备忘录模式
2012-10-24 10:41 0备忘录模式: 在不破坏封闭的前提下,捕获一个对象的内部状态,并 ... -
15设计模式-命令模式
2012-10-24 10:41 0命令模式 将“请求”封装成对象,以便使用不同的请求、队 ... -
14设计模式-责任链模式
2012-10-31 09:46 765责任链模式: 责任链模式是一种对象的行为模式。在责任链模式里, ... -
13设计模式-组合模式
2012-10-21 14:02 0组合模式详细: 对象间常常通过树结构来组织(包含)起来,以实现 ... -
11.设计模式-外观模式
2012-10-21 13:43 0动机(Motivate): 在软件开发系统中,客户程序 ... -
12设计模式-装饰模式
2012-10-21 10:53 0可以动态的给对象添加 ... -
5设计模式-原型模式
2012-10-19 09:06 0定义:用原型实例指定 ... -
设计模式-自己的理解
2012-10-19 08:52 0参考文章: http://www.cnblogs.com/he ... -
3、4设计模式-生成器模式&单例模式
2012-10-18 20:41 03.生成器模式: 适用: 分步骤创建一个复杂的对象。 构建一 ... -
9.Java静动态代理模式示例
2011-11-16 10:59 9021.静态代理模式 使用场合: 为其他对象提供一种代理以控制对这 ... -
6.观察者模式详解:关门打狗
2011-11-15 12:17 1480观察者模式原理 观察者模式是对象行动模式,又叫做宣 ... -
1.工厂方法与2.抽象工厂详解
2011-11-15 11:05 991下面是一个典型的工厂方法模式: package com; ...
相关推荐
java设计模式示例 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型...
文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...
行为型模式则关注对象的交互和职责分配,包括观察者模式、策略模式、模板方法模式等。 使用设计模式的好处包括: 提高软件的可维护性和可复用性,因为设计模式提供了通用的设计语言和最佳实践。 使代码更易于理解和...
24种设计模式的入门,整合7种开发语言的代码示例。 (C#、JAVA、JavaScript、C++、Python、Go、PHP) 第一节 设计模式:学习顺序 第二节 简单工厂模式 第三节 工厂方法模式 第四节 抽象工厂模式 第五节 单例模式 第...
带有单元测试的Java设计模式示例。 描述 该项目是一个个人库,其中包括一些重要的Java Design Patters,它们使用了漂亮有趣的示例并为每种模式实现了单元测试。 创作模式 单元测试 结构模式 单元测试 适配器 适配器...
1.1.2. 在Tomcat 服务器上运行示例.......................................................................................................................... 15 1.1.3. 运行测试..............................
第6章阐释行为模式(职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者模式);第7章针对所有设计模式向初学者提供一些提示;第8章包括常见的面试问题及实际示例;第9章涵盖Java...
书中提到的所有设计模式的列表: 现实示例,类图,源代码,适用性,参考等解释的所有设计模式。 设计模式(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...
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...
11.3.7. DataSourceTransactionManager类 11.3.8. NativeJdbcExtractor 11.4. JDBC批量操作 11.4.1. 使用JdbcTemplate进行批量操作 11.4.2. 使用SimpleJdbcTemplate进行批量操作 11.5. 通过使用SimpleJdbc类...
第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...
第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...
第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...
1. 介绍.........................................................................................................18 1.1. 关于本书..........................................................................
1. 介绍.........................................................................................................18 1.1. 关于本书...........................................................................
行为型设计模式 模板方法模式代码示例 策略模式代码示例 观察者模式代码示例 责任链模式代码示例 命令模式代码示例