设计模式03 - 面向对象 - 贫血模型和充血模型分析

一、贫血模型 和充血模型

      核心思想:贫血模型 - 面向过程;  充血模型 - 面向对象

1、定义

  贫血模型:只包含数据,不包含业务逻辑的类,将数据与操作分离,破坏了面向对象的封装特性,是一种典型的面向过程的编程风格。我们经常这样写

  充血模型:数据和对应的业务逻辑被封装到同一个类中。因此,这种充血模型满足面向对象的封装特性,是典型的面向对象编程风格。

2、MVC开发模式下,贫血和充血的区别

  MVC 三层架构中的 M 表示 Model,V 表示 View,C 表示 Controller。它将整个项目分为三层:展示层、逻辑层、数据层。MVC 三层开发架构是一个比较笼统的分层方式,它代表的是一个思想。具体的有细微区别。基于MVC,将后端项目分为 Repository 层、Service 层、Controller 层。其中,Repository 层负责数据访问,Service 层负责业务逻辑,Controller 层负责暴露接口。

2.1 贫血模型下的MVC开发模式

  基于贫血模型下的MVC,可以为:对于一个用户类,UserEntity 和 UserRepository 组成了数据访问层,UserBo 和 UserService 组成了业务逻辑层,UserVo 和 UserController 在这里属于接口层。

实体层:UserEntity(User类对应的数据库实体类) 和 UserRepository (得到UserEntity的相关逻辑,比如public UserEntity method(Integer id) {} )

业务层:UserBo (Service层的User处理类) 和 UserService(业务逻辑处理,eg: public UserBo method() { } )

展示层:UserVo (展示层需要的类) 和 UserController(调用业务层逻辑,得到Vo eg:public UserVo method() { } )

  我们发现,每一层的数据和逻辑都分离了,数据有单独的数据类,逻辑有单独的逻辑类。这就是贫血模型;

2.2 充血模型下的MVC开发模式

  在基于贫血模型的传统开发模式中,主要集中在Service层不同。Service 层包含 Service 类和 BO 类两部分,BO 是贫血模型,只包含数据,不包含具体的业务逻辑。业务逻辑集中在 Service 类中。在基于充血模型的 DDD 开发模式中,Service 层包含 Service 类和 Domain 类两部分。Domain 就相当于贫血模型中的 BO。不过,Domain 既包含数据,也包含业务逻辑。而 Service 类变得非常单薄。

总结一下的话就是,基于贫血模型的传统的开发模式,重 Service 轻 BO;基于充血模型的 DDD 开发模式,轻 Service 重 Domain。

2.3 如何选择贫血模型还是充血模型

 贫血模型充血模型
设计难易程度 简单 复杂
是否适合业务复杂的系统 不适合(处理业务简单的系统) 适合
复用性和可维护性 不好,逻辑都集中在service层 好,同一个类的很多逻辑都在一个domain类中 比如:账户类,需要计算利率,还款等复杂逻辑,建议使用充血

  我的建议是,针对不同的场景,使用什么模型。比如,有的场景,像账户类,里边本身就有计算利息,计算还款金额等复杂的信息,本身的成员变量尽量通过函数的方式暴露修改,那么就使用充血模型,有些简单的类,比如,规则表类,本身没有对规则做出很多操作,那么就使用贫血模型操作;

posted @   云执  阅读(234)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示