设计模式:基于贫血的MVC开发模式VS基于充血的DDD开发模式

一、基于贫血的MVC开发模式

MCV三层框架中

M表示Model(数据层),

V表示View(展示层),

C表示Controller(逻辑层)。

但在实际项目中会有所适当调整,

后端项目分为

Respository层(负责数据访问,由Entity和Respository类构成),

Service层(负责业务逻辑,由Bo和Service类构成),

Controller层(负责暴露接口,由Vo和Controller类构成)。

贫血模式是数据和业务逻辑相分离,是面向过程的编程风格,不符合面对对象的封装特性。

比如Service层的数据和业务逻辑,被分离在BO和Service两个类中。

像BO这样,只包含数据,不包含业务逻辑的类,就叫贫血模型。同理,Entity和VO类也是一样。

二、基于充血的DDD开发模式

充血模式指数据和业务逻辑相结合,一起被封装在同一个类中。

DDD开发模式也是按照传统MVC架构分层的,也是Respository层,Service层,Controller层。

但基于充血的DDD开发模式中,Serivce层由Service类和Domain类两部分构成,Domain类不仅包含数据,还包含业务逻辑,而Serive类就变得轻薄。

DDD(Domain Drive Design)领域驱动设计,核心思想是解耦与内聚,建立领域模型聚合根,将部分原来在Service层的业务逻辑移动到充血的Domain领域模型内,让Service类的实现依赖这个Domain类。

比如,在钱包业务中,WalletService类的充值方法逻辑:第一步,从数据层查询钱包实体信息;第二步,钱包的余额加上充值金额 ;第三步,数据层保存最新钱包金额。

如果转换为充血的DDD开发模式,则创建一个WalletDomain钱包领域类,将第二步的业务逻辑封装为WalletDomain类里的方法。

在基于充血的DDD开发模式下,Service类并不会完全移除,而是负责一些不适合放在Domain类中的功能。

比如,负责与Respository层打交道,跨领域模型的业务聚合功能,幂等事务等非功能性的工作。

基于充血的DDD开发模式跟基于贫血的MVC开发模式相比,Controller层和Respository层的代码基本上相同。

这是因为,Respository层的Entity生命周期有限,Controller层的VO只是单纯作为一种DTO。

三、两种开发模式的区别

两种开发模式的区别在于Service层,

基于贫血模式的MVC开发模式,重Service轻BO;

而基于充血模型的DDD开发模式,轻Serivie重Domain。

四、基于贫血模式的开发受欢迎原因

1、业务系统比较简单

2、充血模型更难

3、思维固化,转换成本

五、两种开发模式的适用场景

对于复杂业务系统的开发来说,基于贫血的开发模式会让代码越来越混乱,最终导致无法维护。

复杂系统对代码的复用性,易维护性要求高,需要前期大量设计。

而基于充血模型的DDD开发模式,也正好需要前期大量的业务调研,设计领域模型,充当可复用的业务中间层。后期新功能需求的开发,也都基于之前定义好的这些领域模式来完成。

因此,基于充血的DDD开发模式,更适合业务复杂的系统开发。比如,包含各种利息计算模型,还款模型等复杂业务的金融系统等。

而基于贫血的MVC开发模式比较适合简单的系统开发。

你可能感兴趣的:(设计模式,mvc,设计模式,java)