【Java-POJO-设计模式】JavaEE中的POJO与设计模式中多态继承的冲突

最近看《重构》谈到利用OO的多态来优化 if else 和 switch 分支语句,可是我发现OO语法中的多态在使用框架的JavaEE中是没法实践的。对此,我感到十分的疑惑,加之以前项目中有个“状态模式”类的模块被频繁改动的需求折磨要死,又去看了《设计模式》。《设计模式》中也是强调,使用多态和继承来实现“状态”模式。但在采用了 SSH 或 SSM 的项目中,但我历来没有在 实体类(POJO/Bean)中见到过“继承”的语法形式。
 
因而,我搜集了所谓 POJO 、JavaBean、VO、PO、DTO这几个相近概念的含义。
 

 
POJO
 
 一:什么是POJO
POJO的名称有多种,pure old java object 、plain ordinary java object 等。
按照Martin Fowler的解释是“Plain Old Java Object”,从字面上翻译为“纯洁老式的java对象”,但你们都使用“简单java对象”来称呼它。
POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。

 

二:为何会有POJO?
主要是Java的开发者被EJB的繁杂搞怕了,你们通过反思,又回归“纯洁老式”的JavaBean,即有无参构造函数,每一个字段都有getter和setter的java类。java

 

三:POJO的意义
POJO让开发者可专一于业务逻辑和脱离框架的单元测试。除此以外, 因为POJO并不需要继承框架的类或实现其接口,开发者可以极其灵活地搭建继承结构和建造应用。
POJO的意义就在于它的简单而灵活性,由于它的简单和灵活,使得POJO可以任意扩展,从而胜任多个场合,也就让一个模型贯穿多个层成为现实。
先写一个核心POJO,而后实现业务逻辑接口和持久化接口,就成了Domain Model; UI须要使用时,就实现数据绑定接口,变成VO(View Object)。程序员

 

四:POJO与PO、VO的区别
POJO是指简单java对象(Plain Old Java Objects、pure old java object 或者 plain ordinary java object)。
PO是指持久对象(persistant object持久对象)。
VO是指值对象或者View对象(Value Object、View Object)。注意,本文的VO特指View Object。
持久对象实际上必须对应数据库中的entity,因此和POJO有所区别。好比说POJO是由new建立,由GC回收。可是持久对象是insert数据库建立,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象每每只能存在一个数据库Connection之中,Connnection关闭之后,持久对象就不存在了,而POJO只要不被GC回收,老是存在的。
因为存在诸多差异,所以持久对象PO(Persistent Object)在代码上确定和POJO不一样,起码PO相对于POJO会增长一些用来管理数据库entity状态的属性和方法。而ORM追求的目标就是要PO在使用上尽可能和POJO一致,对于程序员来讲,他们能够把PO当作POJO来用,而感受不到PO的存在。数据库

 

五:POJO的扩展
POJO仅包含最简单的字段属性,没有多余的东西,它本质上就是一个普通的JavaBean。
可是在POJO的基础上,可以扩展出不一样的对象。
为POJO增长了持久化的方法(Insert、Update、Delete……)以后,POJO就变成了PO。
为POJO增长了数据绑定功能以后,POJO就变成了View Object,即UI Model。
为POJO增长业务逻辑的方法(好比单据审核、转账……)以后,POJO就变成了Domain Model。
POJO还能够看成DTO使用。设计模式

 


 

 

我一直认为:概念,名词,理论无非是人用来理解、抽象事物的,是拿来用的。若是没有相应的名词,咱们本身也能够创造。框架

 

我的感受,在SSM或SSH的 JavaWeb 项目中,领域模型【Domain Model】(如成绩管理系统里面的学生、成绩等实体) 通常是被简化为 POJO ,而后这个 POJO 既用做 VO 也用做 PO 。Struts 或 Sprint MVC 用 VO 来包裹页面的数据,传给 Action  或 Controller ; Action  或 Controller 内部 用 DTO【Data Transfer Object 】互相传输数据; Hibernate 或者 MyBatis 用 PO 来包裹 业务逻辑处理过的数据 放到 数据库中。在这里,VO 和 PO 由于简单,就使用同一个 POJO 了事。可是若是咱们遇到复杂的 领域模型,这个须要使用 继承和多态的 结构应该放在哪里呢 ?  POJO ? PO?VO?DTO?我以为,这时候,是否是就应该须要另一层 ?函数

 

举个在《设计模式:Java语言》中的“状态模式”的例子。单元测试

有个传送带,它有一个用于放入物品的门和控制门开关的按钮。当门关着时,按钮开门;当门开着时,按钮使门继续保持打开;当门开着,且2分钟没有操做时,门自动关闭;当门正在关闭时,按钮使门打开;当门正在打开时,按钮开门。【具体细节忘了。。。】测试

博主:简单的说,就是按钮老是要开门,门超时会自动关闭。门除了开关两个状态,还有“正在开 Opening ”  和 “正在关 Closing”两个状态。优化

书中建议使用 状态模式,也就是说须要 设计 含有继承关系的几个类。若是这个功能出如今采用了 SSM 框架的 JavaEE项目中,那么,这个继承关系该设计到哪里呢?翻译

相关文章
相关标签/搜索