关于贫血模型和充血模型

  • 什么是贫血模型?
  • 什么是充血模型?

什么是贫血模型?

贫血模型(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会变成一个基本稳定的业务类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值