学点新东西(五)领域模型之失血、贫血、充血、胀血模型

本文解析了领域模型的四种类型:失血、贫血、充血和胀血模型,对比了各模型的特点和服务、模型、数据访问对象的职责分配。指出失血和胀血模型较少见,而贫血和充血模型在软件设计中更为常见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

领域模型分为4大类:失血模型、贫血模型、充血模型、胀血模型。这类理论都是些软件设计领域的大牛(如Martin Fowler)提出来的,有其背景和原因,这里第一步先了解它们是什么,以后再深挖。

想要理解这几个分类,先要知道“血”指的是domain object的model层内容。

1、失血模型

失血模型中,domain object只有属性的get set方法的纯数据类,所有的业务逻辑完全由Service层来完成的,由于没有dao,Service直接操作数据库,进行数据持久化。

service:  肿胀的服务逻辑

model:只包含get set方法

显然失血模型service层负担太重,一般不会有这种设计。

2、贫血模型

贫血模型中,domain ojbect包含了不依赖于持久化的原子领域逻辑,而组合逻辑在Service层。

service :组合服务,也叫事务服务

model:除包含get set方法,还包含原子服务(如获得关联model的id)

dao:数据持久化

贫血模型比较常见,其问题在于原子服务往往不能直接拿到关联model,因此可以把这个原子服务变成直接用关联modelRepo拿到关联model,这就是充血模型。

3、充血模型

充血模型中,绝大多业务逻辑都应该被放在domain object里面,包括持久化逻辑,而Service层是很薄的一层,仅仅封装事务和少量逻辑,不和DAO层打交道。

service :组合服务 也叫事务服务

model:除包含get set方法,还包含原子服务和数据持久化的逻辑

充血模型的问题也很明显,当model中包含了数据持久化的逻辑,实例化的时候可能会有很大麻烦,拿到了太多不一定需要的关联model。

4、胀血模型

胀血模型取消了Service层,只剩下domain object和DAO两层,在domain object的domain logic上面封装事务。

 

一般来说失血模型和胀血模型不常见,多采用贫血模型。

贫血模型和充血模型的差别在于,领域模型是否要依赖持久层,贫血模型是不依赖的,而充血模型是依赖的。

 

 

参考资料:

https://blog.csdn.net/chenxiang0207/article/details/6423086

https://blog.csdn.net/bxl_1986/article/details/79097493

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值