java 充血模型_关于架构设计的“贫血模型”与“充血模型”

2023-10-08 21:59

本文主要是介绍java 充血模型_关于架构设计的“贫血模型”与“充血模型”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

初识“贫血模型”与“充血模型”,是在李刚老师(不是那个官二代他爹…..)的《轻量级J2EE开发实践》中,它们是面向对象程序设计对实体(Entity)建模的两种方式。对于需求分析得到的Entity,首先面临的问题是如何构建Domain Object(领域模型)。贫血模型与充血模型给出了两种不同的方案:

贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。

充血模型:层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic(业务逻辑层)只是简单封装部分业务逻辑以及控制事务、权限等。

简而言之,贫血模型下,Domain Object只是个保存相关属性的马甲,其中的内容需要Business Logic注入,而充血模型下,Domain Object既有肉体(属性)也有灵魂(业务逻辑),Business Logic只是其逻辑的简单封装。

图灵社区上的讨论给出了贫血模型与充血模型的优缺点:

这种贫血的模型好处是:

1、每个贫血对象职责单一,所以模块解藕程度很高,有利于错误的隔离。

2、非常重要的是,这种模型非常适合于软件外包和大规模软件团队的协作。每个编程个体只需要负责单一职责的小对象模块编写,不会互相影响。

贫血模型的坏处是:

1、由于对象状态和行为分离,所以一个完整的业务逻辑的描述不能够在一个类当中完成,而是一组互相协作的类共同完成的。因此可复用的颗粒度比较 小,代码量膨胀的很厉害,最重要的是业务逻辑的描述能力比较差,一个稍微复杂的业务逻辑,就需要太多类和太多代码去表达(针对我们假定的这个简单的工时管 理系统的业务逻辑实现,ruby使用了50行代码,但Java至少要上千行代码)。

2、对象协作依赖于外部容器的组装,因此裸写代码是不可能的了,必须借助于外部的IoC容器。

充血模型的好处是:

1、对象自洽程度很高,表达能力很强,因此非常适合于复杂的企业业务逻辑的实现,以及可复用程度比较高。

2、不必依赖外部容器的组装,所以RoR没有IoC的概念。

充血模型的坏处是:

1、对象高度自洽的结果是不利于大规模团队分工协作。一个编程个体至少要完成一个完整业务逻辑的功能。对于单个完整业务逻辑,无法再细分下去了。

2、随着业务逻辑的变动,领域模型可能会处于比较频繁的变动状态中,领域模型不够稳定也会带来web层代码频繁变动。

我在设计XueBa时,采用了“贫血模型”的设计思路,具体原因有下:

1.  贫血模型使得Domain Object小巧精炼,便于维护;

2.  项目的业务逻辑严重依赖于数据库操作,由于Business Logic同时封装了DAL(Data Access Layer)(原因是项目总体代码量不大),将业务逻辑放在Business Logic里自然顺理成章

3.  如上所述,贫血模型适合团队协作,尤其适合我们这种半瓶醋性质的团队~

举个例子,依照贫血模型,我将Domain Object之一——Document类设计如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

namespace XueBa.Entity

{

public class Document : ITagable

{

public Document()

{

Tags = new List();

}

public int Id { get; set; }

public int FieldId { get; set; }

public User Poster { get; set; }

public string Title { get; set; }

public int TypeId { get; set; }

public Author Author { get; set; }

public Institution Institution { get; set; }

public DateTime PostDateTime { get; set; }

public int Views { get; set; }

public List Tags { get; set; }

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

它很像一个POJO(Plain and Old Java Object),微软是否也应该发明下POCO(Plain and Old C#  Object)?

相应的,对应一个DocumentManager(Business Logic & DAL):

48304ba5e6f9fe08f3fa1abda7d326ab.png

namespace XueBa.SqlServer

{

public class DocumentManager

{

public DocumentManager()

{

}

public Document GetDocumentById(int id)

{

......

}

private Document fillDocument(SqlDataReader reader)

{

.......

}

public List GetDocumentByRange(int pageNum)

{

.......

}

public List GetPopularDocuments(int num)

{

.....

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

由于业务逻辑并不复杂,因此这样的设计时可行的。

这篇关于java 充血模型_关于架构设计的“贫血模型”与“充血模型”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/168266

相关文章

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

Spring Security6.3.x的使用指南与注意事项

《SpringSecurity6.3.x的使用指南与注意事项》SpringSecurity6.3.1基于现代化架构,提供简洁配置、增强默认安全性和OAuth2.1/OIDC支持,采用Lambda... 目录介绍基础配置 (Servlet 应用 - 使用 Lambda DSL)关键配置详解(Lambda DS

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1