跟我学软件系统数据访问层设计中所涉及J2EE核心设计模式——组合式的DTO(Transfer Object Assembler)模式
- 格式:pdf
- 大小:86.71 KB
- 文档页数:3
1.1跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——值列表处理器(Value List Handler)模式1.1.1值列表处理器模式(Value List Handler)1、应用的技术背景(1)查询操作通常涉及大型数据集许多J2EE应用程序都要求显示作为用户查询结果的数据库记录清单。
这些查询操作通常涉及到在服务器端处理大型数据集。
例如,在包含数千种产品的在线产品目录中进行的典型查找过程。
(2)如何在可伸缩性和性能方面进行合理地折中在并发客户数量增加的情况下,处理大型结果集的应用程序将面临可伸缩性和性能方面的问题。
根据用户提出来的查询条件执行查询过程时,很可能没有办法预测会有多少数据返回。
这个结果记录集可能包含庞大的数据量,这样您不能盲目的把查询结果返回客户,否则将导致意外的性能问题。
(3)使用值列表处理器模式为了管理大型数据库返回记录集,人们经常使用Value List Handler这种设计模式。
2、值列表处理器模式的工作原理(1)控制搜索、缓存查找结果J2EE Blueprint 推荐使用这种模式来控制搜索、缓存查找结果并把查找结果提供给客户。
下图显示了一个Web客户、一个值列表处理器和一组基层实体EJB之间的关系。
(2)以分页方式迭代返回在这一解决方案中,当客户需要搜索数据时,Value List Handler就被调用,它截取客户搜索请求并把结果记录集以分页方式迭代返回。
ValueListHandler提供有查询执行功能和结果缓存。
(3)ValueListHandler是一个集合类而其中的ValueListHandler是一个集合类(并且ValueListHandler总是隐藏在façade门面的后面),它包含一组表示数据库记录的Transfer Object。
在这个设计模式中,该处理程序并不返回整个结果清单,它只返回数据的一个子集。
3、值列表处理器模式中的数据源一般是作为一个有状态会话bean实现的,它要求基层的数据源获取所需的数据。
1.1跟我学J2EE 系统构架和设计模式——Java平台中的各种数据访问设计模式1、Java平台中的各种数据持久化技术大多数应用程序都需要处理数据。
Java应用程序运行时,往往把数据封装为相互连接的对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们的方法。
有时候,甚至在编写应用程序之前,数据就已经存在了,所以需要有读入它们和将其表示为对象的方法。
手动编写代码来执行这些任务不仅单调乏味、易于出错,而且会占用整个应用程序的很大一部分开发工作量。
(1)JDBC大多数Java开发员都是用JDBC来和数据库进行通信,它可以通过DAO(Data Access Object)模式来进行改善和提高,然而,这种方式在大型应用程序中则会造成维护的“高消费”"。
JDBC 提供了还算不错的数据库抽象,但是需要用痛苦的API。
这些问题包括:1)需要冗长的错误处理代码来确保ResultSets,Statements以及(最重要的)Connections在使用后关闭。
这意味着对JDBC的正确使用可以快速地导致大量的代码量。
它还是一个常见的错误来源。
Connection leak可以在有负载的情况下快速宕掉应用程序。
2)SQLException相对来说不能说明任何问题。
JDBC不提供异常的层次,而是用抛出SQLException来响应所有的错误。
找出到底哪里出错了——例如,问题是死锁还是无效的SQL?——要去检查SQLState或错误代码。
这意味着这些值在数据库之间是变化的。
为了便于理解,让我们来看一段传统的JDBC代码:Connection conn =null;Statement stmt = null;try{conn = dataSource.getConnection();stmt = con.createStatement();stmt.executeUpdate("UPDATE userInfo SET age = 18 WHERE id = 'erica'"); }catch(SQLException e){}finally{if (stmt != null){try{stmt.close();}catch (SQLException ex){logger.warn("Exception in closing JDBC Statement", ex);}}if (conn != null){try{conn.close();}catch (SQLException ex){logger.warn("Exception in closing JDBC Connection", ex);}}}类似上面的代码非常常见。
1.1跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——数据访问对象(data access object,DAO)模式1.1.1数据访问对象(data access object,DAO)模式1、DAO模式(1)DAO模式简介将对数据源的访问(也就是获得数据库的连接)抽象为一个类,从而利用数据访问对象可以实现对不同数据库类型和形式的数据资源进行访问。
(2)应用的技术背景1)这种模式出现的背景在于数据访问的逻辑极大程度上取决于数据存储的格式2)比如说关系型数据库、面向对象数据库、磁盘文件等。
2、为什么要使用DAO模式1)目前大部分的J2EE应用程序都需要在一定程度上使用可持久性的数据,而实现持久性数据的方法因应用程序不同而异,并且访问不同存储格式数据的应用程序接口(API)也有着显著的差别;2)有的时候,应用程序还会访问存储在不同操作平台上的数据,这使得问题更为复杂3)在Java语句中可以嵌入SQL语句,用以访问关系型数据库,当然根据数据库类型的不同,SQL语句的词法和语法也会有所不同;4)需要说明的是,当数据存储格式不同的时候,数据访问逻辑的区别就更加明显了,例如关系型数据库、面向对象数据库和磁盘文件,各自数据的访问逻辑各有千秋,这样一来就造成了程序代码和数据访问代码之间的依赖关系3、DAO模式的类图和序列图(1)类图(2)序列图对上面的各个对象的说明1)业务对象(Business Object)。
表示数据的用户,它需要对于数据的访问,一个业务对象可以用会话bean、实体bean或是其他Java程序来实现。
2)数据访问对象(Data Access Object)。
数据访问对象是这种模式中的主题,它提供了底层数据访问的对象,并将其提供给业务对象以使得后者能够透明地访问数据源;同时业务对象也将数据的加载和存储操作移交给数据访问对象处理。
3)数据源(Data source)。
这里指的是数据源的物理实现,这个数据源可以是一个数据库,包括关系型数据库、面向对象数据库或文件系统。
1.1跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——值对象(Value Object)模式在本单元中希望重点了解和掌握如下的数据访问层设计模式的具体应用:值对象的JavaBean组件,传输对象模式(DTO),组合式DTO模式,DAO设计模式,工厂模式,抽象工厂模式,快速道读取器模式。
1.1.1值对象(Value Object)模式1、各种值对象的JavaBean组件(复合实体,值对象组装器,值列表处理器)(1)各种“值Bean”以实现对数据库各个表中的数据进行封装从而为J2EE中的各个层进行数据传递提供快捷的解决方案同时也为了提高接口的粗粒度。
同时值Bean实际上也是用于存储中间数据模型的视图帮助类(View Helper)的另一种叫法。
(2)值对象是任意的可串行化的Java对象它在一次网络传输中包含和封装了大量的数据并被保存在内存中。
这样,当客户端需要再次使用数据的时候,不用再次到数据库中查询,而是直接在内存中读取值对象,节省了大量的时间和系统开销。
2、为什么要提供各种值对象的JavaBean组件我们知道EJB 的调用使用了远程方法,它的效率一般要远低于本地方法的调用,这样我们要读取一个对象,如果使用他的getXX 方法就多次调用了远程,效率很低,如果一次性读到值对象,这就减少了远程调用。
我们在实际开发中,一般为每个EntityBean 建一个值对象,并且在EntityBean 中的Home 接口中,增加一个create 方法,参数就是与该EntityBean相对应的值对象;并且在Remote接口中增加setValueObjectData 和getValueObjectData 方法,实现对该值对象操作。
3、本示例项目所涉及的各个“值Bean”为项目中的每个EntityBean 建立值对象,在本项目中主要设计出如下的各个值Bean1)封装用户信息的UserInfoData类2)封装图书作者个人信息的BookAuthorInfoData类3)封装图书信息的BookInfoData类4)封装用户的存款信息的EBankChecker类。
10.1 什么是DTO在分布式系统中,客户端和服务器端交互有两种情形:第一个是客户端从服务器端读取数据;第二个是客户端将本身的数据传递给服务器端。
当有客户端要向服务器端传输大量数据的时候,可以通过一个包含要传输的所有数据的方法调用来完成。
这在小数据量的时候缺点并不明显,但是如果要传递包含有大量信息的数据的时候,这将变得难以忍受。
下面的方法是任何人看了都会害怕的:public void save(String id,String number,String name,int type,int height,int width,BigDecimal weight,BigDecimal price,String description)这种接口也是非常的脆弱,一旦需要添加或者删除某个属性,方法的签名就要改变。
当客户端要从服务器端取得大量数据的时候,可以使用多个细粒度的对服务器端的调用来获取数据。
比如:ISomeInterface intf = RemoteService.getSomeInterface();System.out.println("您要查询的商品的资料为:");System.out.println("编号:"+intf.getNumber(id));System.out.println("姓名:"+intf.getName(id));System.out.println("类型:"+intf.getType(id));System.out.println("高度:"+intf.getHeight(id));System.out.println("宽度:"+intf.getWidth(id));System.out.println("价格:"+intf.getPrice(id));System.out.println("描述信息:"+intf.getDescription(id));这种方式中每一个get***方法都是一个对服务器的远程调用,都需要对参数和返回值进行序列化和反序列化,而且服务器进行这些调用的时候还需要进行事务、权限、日志的处理,这会造成性能的大幅下降。
dto概念-回复DTO(Data Transfer Object)概念DTO(Data Transfer Object)是一种软件设计模式,用于数据传输和通信的目的。
它是将数据从一个层传送到另一个层的方式,以便于在不同的层之间传输和使用。
在一个典型的应用程序中,数据通常会在多个层之间传递,例如前端界面、业务逻辑层、数据访问层等。
这些层之间往往需要进行数据的传输和交互,而DTO就是为了解决这一问题而应运而生的。
一、DTO的概念和作用在传统的三层架构中,通常会有数据实体对象、业务逻辑对象和数据访问对象等不同的对象。
而这些对象之间往往需要进行数据的传输和交互,但是它们的字段和结构往往会有所不同。
为了在不同的层之间传输数据时能够保持一致性和高效性,需要使用DTO来进行数据的转换和传输。
DTO可以理解为一种封装了数据的对象,它只包含数据字段以及相应的访问方法,而不包含任何业务逻辑。
其主要作用有以下几点:1. 数据传输:DTO用于在不同的层之间传输数据,使得各个层之间的数据结构保持一致,避免数据传输过程中的冗余和不必要的转换。
2. 数据隔离:DTO可以帮助将数据的表现形式与实际的数据实体解耦,从而实现数据的隔离和保护。
3. 接口规范:DTO可以作为不同层之间的数据交互的接口规范,使得每个层都可以根据DTO定义的接口来进行数据传输和交互。
二、DTO的设计和实现在设计和实现DTO时,需要考虑以下几点:1. 数据字段:DTO应该包含需要传输的数据字段,并且根据业务需求进行适当的选择和精简,避免冗余和不必要的字段。
2. 数据转换:DTO需要定义数据的传输方式和接口规范,这涉及到数据的序列化和反序列化、数据类型的转换等工作。
在转换过程中,可能会使用到工具类或者第三方库来进行处理。
3. 可拓展性:DTO应该具有可拓展性,以便于应对未来的业务需求和变化。
在设计DTO时,需要考虑到可能的业务变化和需求变更,以保持代码的可维护性和可扩展性。
1.1跟我学J2EE 系统构架和设计模式——软件系统详细设计阶段中的“对象职责分配模式(GRASP)”(第1部分)详细设计阶段包括:模块设计、数据库设计和界面设计。
下面,仅就详细设计中的模块设计部分,讨论与模块设计工作中相关的设计模式应用的有关问题。
在面向对象的方法中,详细设计阶段的一个十分重要的问题,是进行类设计。
类设计直接对应于实现设计,它的设计质量直接影响着软件的质量,所以这个阶段是十分重要的。
这就给我们提出了一个问题,类是如何确定的,如何合理的规划类,这就要给我们提出一些原则,或者是一些模式。
1.1.1模块设计与设计模式的应用1、系统在设计和开发时就应该考虑以后可能的变化(1)用户需求在客观上是不断地变化的在模块设计阶段,最关键的问题是,用户需求是变化的,我们的设计如何“拥抱变化”和“适应变化”呢?(2)需求分析并不能解决一切问题我们经常听到人们在抱怨,一个项目已经通过了交付测试,担投运以后用户又提出了新的需求,这时就面临这样一个问题,修改一段代码就会需要几百个相关代码跟着改变,因此升级就变成几乎不可能的事情,于是,开发者抱怨说,用户为什么当初不提出这些新的需求呢?而用户抱怨说,随着时代的变化当初怎么可能预料到现在的需求呢?最后的结果,恐怕只能是一个,那就是这个系统被弃之不用!其实,这个巨大的损失错在开发者,但却不恰当的由用户来承担了。
(3)比较困惑的事情1)如果我们试图发现事情怎样变化,那我们将永远停留在分析阶段。
2)如果我们编写的软件能面向未来,那将永远处在设计阶段。
因为,我们的时间和预算不允许我们面向未来设计软件。
过分的分析和过分的设计,事实上被称之为“分析瘫痪”。
2、我们如何“拥抱变化”和“适应变化”(1)应该遵守的几个原则1)针对接口编程而不是针对实现编程。
2)优先使用对象组合,而不是类的继承。
3)考虑我们的设计哪些是可变的,注意,不是考虑什么会迫使我们的设计改变,而是考虑要素变化的时候,不会引起重新设计。
1.1J2EE软件系统项目模块设计中所涉及的设计模式1、模式分为三个层次:架构模式,模块设计模式和模块实现模式(1)架构模式是模式中的最高层次,描述软件系统里的基本的结构组织或纲要,通常提供一组事先定义好的子系统,指一它们的责任,并给出把它们组织在一起的法则和指南。
(2)模块设计模式用来处理程序设计中反复出现的问题。
如GOF提出的23个基本设计模式(3)模块实现模式是最低也是最具体的层次,处理具体到与编程语言相关的问题。
2、模块设计模式(1)合理地使用设计模式真正掌握设计模式需要在实践中不断研究和使用,创建模式的人是大师,但是拘泥于模式的人永远是工匠。
在EJB的具体使用中,使用合适的设计模式,不但使代码可重用性可拓展性增强,最重要的是能提高效率和速度,我们知道EJB框架由于考虑大型系统中事务安全等各方面问题,效率性能有所欠缺,那么我们在具体问题具体应用时,使用设计模式可以弥补这个问题。
(2)设计模式是思想GoF的设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java 语言基础上跃进一步,更重要的是,GoF的设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
3、GOF的23种设计模式中比较常用的部分模式说明(1)创建型的模式1)设计模式之Factory(工厂方法和抽象工厂):使用工厂模式就象使用new 一样频繁.2)设计模式之Prototype(原型):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3)设计模式之Builder:汽车由车轮方向盘发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这两种情况分开进行。
4)设计模式之Singleton(单态):保证一个类只有一个实例,并提供一个访问它的全局访问点(2)结构型的模式1)设计模式之Façade:可扩展的使用JDBC 针对不同的数据库编程,Facade 提供了一种灵活的实现。