DDD(二)——实体(Entity)

2.什么是实体

实体就是分析需求所获得的结果,用面向对象的说法就是经过分析需求肯定对象,这些对象有什么做用。java

好比说一个系统的使用者就是用户,那么用户实体须要有惟一标识id,帐号昵称name,登录密码password这些基础属性。数据库

public class User(){
	private Long id;
	private String name;
	private String password;
	get()...
	set()...
}

3.值对象

经过分析需求,咱们不只须要用户实体,还须要给用户分配角色,那么咱们就须要在用户实体中记录角色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

  • bo(bussiness object) -- 业务对象,业务相关性最强,每一个对象之间的逻辑关系体现为业务的复杂性和逻辑性
  • vo (value object)-- 数据对象,主要用于服务层,对bo进行拆分,使其适用代码逻辑的东西
  • po(persistent object)-- 持久化对象,和数据库表对应的对象,用于ORM。

这样描述太官方,简单来讲保存到数据库中的数据有是po,若是须要将性别(0表明男,1表明女)展现在页面上,要么把age这个属性变成男女这两个汉字再传给视图层的对象就是vo,若是是须要对数据进行逻辑处理的实体对象就叫作bo,好比须要大于或者小于。bo和vo并非必定和po一摸同样,能够根据实际业务有多个vo、多个bo,理解为传值的对象。class

4.分类

实体在DDD中也能够称为领域模型,领域模型这一律念在此就很少叙述。实体的做用是什么呢,最主要的做用就是持久化数据,以持久化为基础实体又划分了4大类:基础

  1. 失血模型
  2. 贫血模型
  3. 充血模型
  4. 胀血模型

失血模型简单来讲,就是只有属性的getter/setter方法的纯数据类。object

贫血模型是实体不只包含了getter/setter,还包含一些简单的逻辑。

充血模型与贫血模型相似,只是取消了持久化逻辑(dao),将其包含在了实体当中。

胀血模型就是除了充血模型所包含的,还将service层的业务放入实体当中。

DDD提倡使用充血模型实体,取消了dao,同时减轻service层的压力。

5.小结

DDD中的实体概念上并无不同凡响,只是在选择那种模式设计实体上与以往有差别,并无什么创新观点在其中,反而在业务很是复杂的时候使用充血模型会致使逻辑混乱,代码难以阅读的问题。

相关文章
相关标签/搜索