Flyingis

Talking and thinking freely !
Flying in the world of GIS !
随笔 - 156, 文章 - 16, 评论 - 589, 引用 - 0
数据加载中……

剖析MVC中的各种Object

    作者: Flyingis

    在Web应用和J2EE框架中经常可以碰到各种Object相关的名词,在网上搜索了一下,讨论各种Object术语的帖子一大筐,大的讨论整个框架,小的描述各个层次之间的细微差别,甚至有钻牛角尖之嫌。 BlogJava 上也有讨论VO和PO的贴子,例如 非飞 《各层共享使用PO的代价》 等。其实无论怎么讨论,这些术语、分层结构、应用框架无非都是为我们的应用而服务的,因此,我们需要的是理解这些术语提出的意义,是理解我们的项目需求,是理解我们采用的框架结构能否最大限度的满足项目的需要。

    在刚刚学习MVC/Model2之前,我是不了解VO/TO/PO/DTO/BO等等这些术语的含义的,至少理解上只是停留在浅层面,现在多看了一些,做了一点项目,多了些想法,但肯定还是存在理解上的偏差或误解,欢迎大家讨论指出!

    VO: 通常指ValueObject或ViewObject。ViewObject指的是UI需要的对象,Struts的FormBean就是其中的一种,它是Value Object和Transfer Object的总称。

    TO: Transfer Object,它和Value Object的区别可以参考Patterns of Enterprise Application Architecture。

    PO: Persistent Object,即可以被持久化的实体对象。

   
POJO : Plain Ordinary Java Object。

    DTO: Data Transfer Object,J2EE 中常用的一种设计模式,现在一般可以将使用Value Object的模式称为DTO模式,在
Jdon 上一篇《ValueObject和DTO模式的一些疑问》 阐述了两者的关系。

    BO: Business Object,可以分为三种情况,只包含业务对象的属性,或只包含业务方法,或两者都包含。对于BO的详细讨论,可以
参见这里

    这些概念经常交错在一起提出,给初学者造成了一些理解上的困难,其实只需要理顺下面几点,基本上就能弄清楚层次之前的前后关系和如何合理使用这些对象。

    1. VO能否和PO相同。首先回答是肯定的,VO是概念模型的一种抽象反映,当一个业务实体可以用一个物理实体表示的时候,VO和PO属性相同,那么它们是相等的。例如学生成绩管理系统中,成绩表单业务实体中包含学生信息、课程信息、成绩等,此时它已经不能用一个物理实体所能描述,而其中的学生信息,其VO和PO在属性上是一样的,此时的VO和PO相同。

    2. PO能否代替VO。仅仅从功能实现上来说,当VO和PO相同的时候,PO可以代替VO,这样可以减少一些代码量,但需要注意的是,这样会带来一些问题:当一个业务实体需要多个物理实体来表达的时候,在客户端显示一个业务实体就会多次访问数据库,即进行多次单表访问,非视图;当一个业务实体属性远少于一个物理实体的时候,可能会因装载过多不必要的数据而影响网络传输;对物理实体进行改动的时候会直接影响到表现层。简单的说,这样做增加了代码的耦合性,也增加了代码维护的难度,项目的可扩展性也大大降低,如果仅仅是为了减少代码量而付出这些代将显然是不值的,当然极为简单的应用可以考虑,一切从项目实际出发。

    3. VO包含的属性可以多于PO、少于PO、或等于PO中的属性。

    4. 一个基于Struts应用的简单数据提交流程(VO和PO单独存在):HTML 页面中包含了基本的信息,例如文本框、下拉框、单选等,构建一个ActionForm Bean与之一一对应,它是Web层数据的表示,当Web页面的操作流程发生改变的时候,需要对它进行修改,但不能将修改传递到业务层和持久层。然后Action读取ActionForm Bean的属性,构造PO对象,调用BO ,当BO收到这个PO之后,调用DAO接口方法,对PO进行持久化操作,完成数据的提交。这里,PO在业务层和持久层之间,没有被传递到Web层的View中去。

    5. 一个基于Struts应用的简单数据查询流程(VO和PO单独存在):Action读取ActionForm Bean中的查询属性信息,然后调用BO,BO获取ActionForm Bean之后调用DAO接口进行查询,返回所要查询的PO对象,交给Action,Action通过该PO构建 ActionForm Bean,通过request.setAttribute()或session.setAttribute(),重定向到查询结果页面输出需要的信息。

    6. 表现层中的字段一般定义为String或boolean类型,因此VO中的属性在传到Action并构建PO对象时需要进行数据类型的转换,或由ActionForm的helper方法来进行转换。

    参考文章和贴子:
   
http://www.jdon.com/jive/article.jsp?forum=91&thread=23672
    http://www.jdon.com/jive/article.jsp?forum=91&thread=21571
    http://www.hibernate.org.cn/viewtopic.php?t=627&postdays=0&postorder=asc&start=0
   
http://bbs.hidotnet.com/704/ShowPost.aspx
    http://lifework.cnblogs.com/archive/2005/09/03/229596.html
    http://www.microsoft.com/china/MSDN/library/architecture/patterns/esp/DesDTO.mspx  

posted on 2006-03-17 00:28 Flyingis 阅读(2480) 评论(0)  编辑  收藏 所属分类: Web 框架与开发架构与设计


只有注册用户登录后才能发表评论。


网站导航: