实体就是分析需求所获得的结果,用面向对象的说法就是经过分析需求肯定对象,这些对象有什么做用。java
好比说一个系统的使用者就是用户,那么用户实体须要有惟一标识id,帐号昵称name,登录密码password这些基础属性。数据库
public class User(){ private Long id; private String name; private String password; get()... set()... }
经过分析需求,咱们不只须要用户实体,还须要给用户分配角色,那么咱们就须要在用户实体中记录角色id。ui
public class User(){ private Long id; private String name; private String password; private Long rid; get()... set()... }
public class Role(){ private Long id; private String rname; get()... set()... }
可是这时候需求分析出来用户不止一个角色,那么能够用一个中间表来处理。设计
public class UserAndRole(){ private Long uid; private Long rid; }
这样作是至关麻烦的,由于每次作相关修改都须要查询三张表。DDD所提倡的方式就是将实体对象看成值的方式来处理。code
public class User(){ private Long id; private String name; private String password; private List<Role> role; get()... set()... }
这样就能轻松省力,并且就方便阅读理解。可是这并不表明这种方式是最好的选择,若是关联表使用次数不多,而且不多修改,其实记录id会是更好的选择。对象
值对象这一律念并非DDD中提出的,在以前就有相关的概念,传统的值对象简单的按照业务相关性能够划分为三类指po,vo,bo。get
这样描述太官方,简单来讲保存到数据库中的数据有是po,若是须要将性别(0表明男,1表明女)展现在页面上,要么把age这个属性变成男女这两个汉字再传给视图层的对象就是vo,若是是须要对数据进行逻辑处理的实体对象就叫作bo,好比须要大于或者小于。bo和vo并非必定和po一摸同样,能够根据实际业务有多个vo、多个bo,理解为传值的对象。class
实体在DDD中也能够称为领域模型,领域模型这一律念在此就很少叙述。实体的做用是什么呢,最主要的做用就是持久化数据,以持久化为基础实体又划分了4大类:基础
失血模型简单来讲,就是只有属性的getter/setter方法的纯数据类。object
贫血模型是实体不只包含了getter/setter,还包含一些简单的逻辑。
充血模型与贫血模型相似,只是取消了持久化逻辑(dao),将其包含在了实体当中。
胀血模型就是除了充血模型所包含的,还将service层的业务放入实体当中。
DDD提倡使用充血模型实体,取消了dao,同时减轻service层的压力。
DDD中的实体概念上并无不同凡响,只是在选择那种模式设计实体上与以往有差别,并无什么创新观点在其中,反而在业务很是复杂的时候使用充血模型会致使逻辑混乱,代码难以阅读的问题。