极客设计模式之美学习-传统MVC和DDD充血模型(二)

贫血模型

贫血模型例子

现在传统的MVC开发基本上都是贫血模型 如以下代码 我们工作中经常使用

////////// 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;
}

我们将所有业务逻辑都写在servcie里面 将BO和业务逻辑根据service分离开了,这是一种面向过程的风格开发方式

充血模型

什么是充血模型

在贫血模型中,数据和业务逻辑被分割到不同的类中。充血模型(Rich Domain Model)正好相反,数据和对应的业务逻辑被封装到同一个类中。因此,这种充血模型满足面向对象的封装特性,是典型的面向对象编程风格

什么是领域驱动设计

主要用来指导如何解耦业务系统,划分服务模块,定义业务领域模型及其交互  早在2014年就剔除,真正兴起是在微服务兴起的时候.微服务需要根据公司业务对服务进行合理的划分。而ddd正好可以做到指导的作用

实际上DDD也是传统的MVC三层  在service加了一层doman  跟贫血不一样的是 BO除了包含数据 还包含了对应数据的业务处理

贫血模型:重Service 轻Bo   充血模型:轻Service 重Bo

为什么基于贫血模型的传统开发模式如此受欢迎

  1. 大部分公司业务都比较简单,就算基于充血模型设计 模型也比较单薄 ,与其绞尽脑汁设计充血模型不如直接使用贫血模型。而且业务也经常变 或者整体推翻重做
  2. 充血模式比贫血更加有难度,充血模型 是根据模型定义要暴露哪些操作 而不是贫血模型 我们先定义好数据表结构 然后根据数据表结构有哪些业务 就在service添加对应处理业务的方法
  3. 思维固化现在基本上的程序开发都是贫血模型 开发人员也是使用贫学模型,如果使用充血模型学习成本增加

什么项目应该考虑使用基于充血模型的 DDD 开发模式

业务复杂的项目应该优先考虑使用DDD开发模式

因为贫血模型 我们是基于业务再service定义个对数据表CRUD的操作,对业务耦合性比较大,无法重用,

而基于ddd则是根据模型定义好要暴露的操作 然后在service根据业务使用这些暴露的操作完成一系列业务,复用性更强 越复杂的系统对重用性要求更强

原文地址:https://www.cnblogs.com/LQBlog/p/12107284.html

时间: 2024-10-09 23:49:40

极客设计模式之美学习-传统MVC和DDD充血模型(二)的相关文章

极客匿名项目APP学习

极客网,极客匿名项目APP学习学习总结: 该项目非常简单学到内容及运用到技术: 1.全部根据文档要求,规范化开发项目,一步一步的实现功能效果. 2.MD5工具使用 3.URLConnection进行网络连接,并进行封装. 4.AsyncTask异步任务的使用 5.获取联系人,并进行JSON转化. 6.缓存的使用 7.adapter的使用 项目Client和Server及文档下载地址:http://download.csdn.net/detail/itjavawfc/8553795 一)缓存使用:

设计模式之美学习-重构

为什么要重构 重构是时刻保证代码质量的一种手段,避免代码腐化到不可维护的地步,同时也是避免前期过度设计.优秀的产品都是迭代出来的,我们不可能提前预知未来需求,所以重构也是无法避免的. 重构的二种方式 大型重构 对 系统.模块.代码结构.类与类之间的关系等的重构,重构的手段有:分层.模块化.解耦.抽象可复用组件.此类重构会对代码的改动比较大,影响比较深. 比如我们的代码中有很多if else 判断 我们重构提取一个抽象 然后根据条件创建不同的处理类 小型重构 对类.函数.变量等代码级别的重构,比如

设计模式之美学习-设计模式-建造者模式(十起)

需求 我们需要定义一个资源池配置类 ResourcePoolConfig.这里的资源池,你可以简单理解为线程池.连接池.对象池等.在这个资源池配置类中,有以下几个成员变量,也就是可配置项.现在,请你编写代码实现这个 ResourcePoolConfig 类. 实现方式一 实现 public class ResourcePoolConfig { private static final int DEFAULT_MAX_TOTAL = 8; private static final int DEFA

设计模式之美学习-结构型-装饰者模式(二十)

什么是装饰者模式 在不破坏被装饰类的业务逻辑的情况下进行增强 同时支持装饰多层,与代理模式很像 装饰者侧重增强,代理侧重控制 Java IO 类图 使用 //FileInputStream是转为用于读取文件流的类 InputStream in = new FileInputStream("/user/wangzheng/test.txt"); //是一个支持带缓存功能的数据读取类 对in进行装饰实现增加 带有缓存 InputStream bin = new BufferedInputS

极客编程小挑战#28:实现二级菜单的炫酷显示效果

那么本期挑战的内容是什么?容我卖个关子- 极客标签是一个学习前端知识和分享前端知识的平台.以往的挑战形式,更加偏向于学生完成老师布置的作业.而本期挑战,希望参赛者换个身份参与进来,将自己学习的知识讲授给他人.通过课程的形式,完成任务,并讲解详细,以帮助前端初学者更好地学习为目的,完成此次挑战.   本期挑战: 实现 单击按钮“分享更多”后,下级菜单呈现炫酷显示效果,下级菜单内容如下图(极客标签每篇文章后的分享方式),效果越炫越好- 本次挑战的作品在课程库中添加,以讲解详细.课程效果好为目的.课程

极客学院Android视频分享

知识是用来分享的,愿能够帮助需要帮助的人,相互学习相互交流共同进步! 这是极客学院关于Android学习的一部分视频,还是非常有学习的意义的. 其中涉及到Android基本知识点,项目知识,新技术相关学习. 分享地址:http://pan.baidu.com/s/1gd7vEcr    密码:q3hf

极客标签:用代码回放来愉快地学习前端知识

网 页编程学习的过程中最痛苦的是什么?你看到各种大牛写下的代码和旁边只言片语的说明,但你根本无法理解整套代码是怎样写下来的,大牛写的时候遵循的是什么 样的逻辑.教程放在一个屏幕,然后你自己的编程工具放在另一个屏幕,你在两个屏幕之间切换过来切换过去,浪费了时间浪费了力气. 结果呢?你把大牛的代码复制过来,把自己的项目内容放进去,做出了一个和大牛写的一样的网页,却感觉到自己根本什么都没学到.网页编程,以及所有编程学习中最痛苦的地方在于你试图理解你的学习对象的思路,但常规的教学材料的传播方式生硬,对于

# "做中学"之“极客时间”课程学习指导

目录 "做中学"之"极客时间"课程学习指导 所有课程都可以选的课程 Java程序设计 移动平台开发 网络攻防实践 信息安全系统设计基础 信息安全专业导论 极客时间课程介绍 Winter.程劭非.重学前端 宝玉.软件工程之美 蔡能.从0开始学游戏开发 陈旸.数据分析实战45讲 丁雪丰.玩转Spring全家桶 范学雷.代码精进之路 高磊.9小时搞定微信小程序开发 郝林.Go语言核心36讲 洪亮劼.AI技术内参 胡峰.程序员进阶攻略 胡忠想.从0开始学微服务 黄申.程序员

学习ASP.NET MVC框架揭秘笔记-传统MVC模式

1.1传统MVC模式 对于大部分面向最终用户的应用来说,他们都需要具有一个与用户进行交互的可视化UI界面,我们将这个UI称为视图(View).在早期,我们倾向于将所有与UI相关的操作糅合在一起,这些操作包括UI界面的呈现.用户交互操作的捕捉与响应.业务流程的执行及对数据的存取等,我们将这种设计模式称为自治视图(Autonomuous View  ,  AV). 1.1.1  自治视图 1.1.2  什么是MVC模式