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

相关文章

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器