- 什么是贫血模型?
- 什么是充血模型?
什么是贫血模型?
贫血模型(Anemic Domain Model)是指开发过程中业务的具体方法不在对应的子业务中实现。
以MVC举例。当前后端分离时,后端大致结构为RSC:
Repository层,用于在和数据库,中间键等交互,属性定义在Entity中,方法实现在Repository。
Service层,使用Repository层提供的方法,实现具体的业务,属性定义在各Bo(Business Object)中,方法实现在Service。
Controller层,负责暴露接口。在需求分析阶段定义的要实现的功能,在这一层抽象成具体方法,属性定义在Vo(View Object)。
这里粘一段争大的代码
// Controller+VO(View Object) //
public class UserController {
private UserService userService; //通过构造函数或者IOC框架注入
public UserVo getUserById(Long userId) {
UserBo userBo = userService.getUserById(userId);
UserVo userVo = [...convert userBo to userVo...];
return userVo;
}
}
public class UserVo {//省略其他属性、get/set/construct方法
private Long id;
private String name;
private String cellphone;
}
// Service+BO(Business Object) //
public class UserService {
private UserRepository userRepository; //通过构造函数或者IOC框架注入
public UserBo getUserById(Long userId) {
UserEntity userEntity = userRepository.getUserById(userId);
UserBo userBo = [...convert userEntity to userBo...];
return userBo;
}
}
public class UserBo {//省略其他属性、get/set/construct方法
private Long id;
private String name;
private String cellphone;
}
// Repository+Entity //
public class UserRepository {
public UserEntity getUserById(Long userId) { //... }
}
public class UserEntity {//省略其他属性、get/set/construct方法
private Long id;
private String name;
private String cellphone;
}
什么是充血模型?
领域驱动设计(Domain Driven Design,简称 DDD)主张业务方法要和属性绑定。贫血模型中将属性和方法分离的方式显然不符合面向对象设计的封装原则。同时值得注意的是,当复杂业务变化的时候,因为业务全在service层,修改显然更加复杂,也不符合对修改关闭的原则。DDD将业务划分成更细的粒度,将贫血模型中的Bo替换为Domain。Domain中除了包含业务属性外,还包含业务方法。Service中保留和Repository层交互的方法,和其他Service交互的方法,其他方法全部迁到具体的Domain中去,这样Service会变成一个基本稳定的业务类。