定义 :

失血模型 : 模型中只包含数据的定义和简单的get和set方法 . 业务逻辑和应用逻辑全部放到服务层中 , 这种在 Java中叫 POJO (重点是完全将业务逻辑和数据定义隔离开来 , )

贫血模型 : 模型中包含POJO以及少量的业务逻辑 , 但是不包含持久层相关的逻辑 (重点在于和持久层逻辑分离开来 , 不依赖于持久层逻辑)

充血模型 : 包含所有的业务逻辑 , 包括持久层相关的逻辑 .(重点在于依赖持久层)

胀血模型 : 胀血模型将一些和业务逻辑不相关的其他逻辑都放到了领域模型中 , 如授权 , 事务等 . 这样一来领域层干了服务层相关的事 , 相当于服务层消失了 ,属于另一种类型的贫血模式

注意 : 一般来讲 我们将失血 , 贫血 , 胀血的三种情况合并称为贫血模式 , 本质上想说明的是持久层和业务逻辑的剥离 .

优劣分析

贫血模型的好处在于 , 首先大多数业务场景都是简单的crud业务场景比较简单 , 没必要用到充血模式 , 一句话就是杀鸡焉用牛刀 . 其次是从单元测试的角度来说 , 贫血模型由于不依赖持久层 , 业务逻辑不必混放在不同的层中,更能体现单一职责性 , 单元测试相对来说比较简单

劣势 : 数据和操作分离之后,数据本身的操作就不受限制了。任何代码都可以随意修改数据. 本质上模型只做了值传递相关的操作 , 违背了面向对象思想的初衷.

充血模型的好处在于 , 将业务相关的逻辑和数据定义结合在一起 , 能够准确的去描述一个对象. 在这个基础上 , 轻量化了service层相关的逻辑 , 简单来说 , 就是使得业务层的代码不在繁重 , 尽量做到代码均匀分布.

劣势 : 首先由于依赖持久层 , 导致单元测试不方便 , 其次是设计之初就比较麻烦 , 需要思考哪些东西放在模型中哪些东西放到服务层中 , 没有贫血模型那么简单 , 直接无脑全写到服务层中