- 浏览: 351630 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (160)
- webservice (2)
- 数据库开发 (9)
- LINUX (6)
- 团队协作 (5)
- 前端技术 (4)
- J2EE (31)
- web服务器 (9)
- 经验常识 (12)
- 开发工具 (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 2378合理使用以下方案,可降低系统的代码复杂度,遵循程序设计的开闭原 ... -
23设计模式-享元模式
2012-11-13 18:55 0作用:共享对象,节省内存 package com; ... -
22设计模式-访问者模式
2012-10-31 17:06 022设计模式-访问者模式 22设计模式-访问者模式 -
21设计模式-中介者模式
2012-10-31 09:42 866中介者模式 中介模式封装一系列的对象交互,集中管理相关对象之间 ... -
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 782责任链模式: 责任链模式是一种对象的行为模式。在责任链模式里, ... -
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 9451.静态代理模式 使用场合: 为其他对象提供一种代理以控制对这 ... -
6.观察者模式详解:关门打狗
2011-11-15 12:17 1506观察者模式原理 观察者模式是对象行动模式,又叫做宣 ... -
1.工厂方法与2.抽象工厂详解
2011-11-15 11:05 1023下面是一个典型的工厂方法模式: package com; ...
相关推荐
在这个"java设计模式示例,demo"压缩包中,可能包含了一些常见设计模式的实际代码示例。下面我们将详细探讨一些重要的设计模式及其在Java中的应用。 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局...
java设计模式示例 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型...
包括 Iterator(迭代模式)、Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Interpreter(解释器模式)、Strategy(策略模式)、State(状态模式)...
4. 行为型模式:包括职责链模式、命令模式、解释器模式、迭代器模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。行为型模式关注于对象之间的交互和行为,帮助我们更好地管理复杂的...
22. **策略模式**:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。Strategy使算法的变化独立于使用算法的客户。示例中会有Strategy接口和ConcreteStrategyA、ConcreteStrategyB。 23. **模板方法...
4. **行为型模式**:包括策略模式、模板方法模式、观察者模式、迭代器模式、职责链模式、命令模式、备忘录模式、状态模式、访问者模式和解释器模式,它们主要处理对象之间的交互和责任分配。 5. **Java语言特性与...
4. **行为型模式**:如策略模式、模板方法模式、观察者模式、责任链模式、命令模式、迭代器模式、访问者模式、备忘录模式、解释器模式等。这些模式关注于对象之间的交互和职责分配。 5. **Java编程范例**:书中会...
9. 策略模式:定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。 10. 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 这些设计模式不仅限于Java,但Java作为面向对象的语言,...
在Java编程中,模板模式和策略模式是两种重要的设计模式,它们主要用于提高代码的灵活性、重用性和可扩展性。 1. **模板模式**: 模板模式是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到...
本资源“Java设计模式代码,设计模式系列所有示例代码”为学习者提供了实际操作设计模式的宝贵机会,使理论与实践相结合,提升开发效率和代码质量。 首先,设计模式分为三大类:创建型、结构型和行为型。创建型模式...
在Java中,策略模式常与接口或抽象类一起使用。 11. **状态模式**:允许对象在其内部状态改变时改变其行为,对象看起来似乎修改了它的类。Java的`java.beans.PropertyChangeSupport`类就支持状态监听。 12. **模板...
而策略模式则常用于算法的封装和选择,允许在运行时动态切换不同的算法策略。 总的来说,《Java与模式》光盘源码提供的实例代码是对理论知识的实践补充,读者可以通过阅读和运行这些代码,加深对设计模式的理解,并...
7. **策略模式**:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户。`StrategyPatternExample.java` 可能展示如何在运行时选择不同的算法策略。 8. **命令模式**:将一个...
- **策略模式(Strategy Pattern)**:定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。 - **模板方法模式(Template Method Pattern)**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。...
在SpringBoot项目中,策略模式可以与依赖注入机制相结合,实现更加灵活的业务逻辑处理。在本文中,我们将详细介绍如何使用策略模式在SpringBoot项目中实现业务逻辑处理。 策略模式的定义 策略模式是一种行为设计...
本资源“Java中23种设计模式-源码示例.rar”提供了全面的Java设计模式实践案例,旨在帮助开发者更好地理解和应用这些模式。 首先,让我们逐一探讨这23种设计模式: 1. **单例模式**:保证一个类只有一个实例,并...
8. 策略模式:Java Collections框架中的Comparator接口,允许用户定义自己的比较策略。 设计模式的应用不仅限于上述示例,它们在实际开发中无处不在。理解并熟练运用设计模式,可以提升代码质量,使代码更易于理解...
在提供的资源“DesignPatternTemplate”中,我们可以预期找到一个Java实现的模板模式示例。通常,这个文件可能包含了如下内容: - 一个抽象类,如`AbstractOperation`,定义了一个模板方法(如`execute()`),这个...
以上仅是部分设计模式的概述,实际的“JAVA设计模式”帮助文档会提供更详尽的解释、示例代码以及如何在Java项目中应用这些模式的指导。理解并熟练运用这些设计模式,可以帮助开发者写出更加灵活、可维护和高效的应用...