当前位置: 首页 > news >正文

【高内聚】设计模式是如何让软件更好做到高内聚的?

高内聚(High Cohesion)是指模块内部的元素紧密协作,共同完成一个明确且相对独立的功能。就像高效的小团队,成员们目标一致,相互配合默契。
低耦合(Loose Coupling)是指模块之间的依赖较少,只通过精心定义的接口与外部交互。这样的设计使得模块对外界的依赖减少,从而提高了系统的灵活性和可维护性。
高内聚是“解耦”的关键,原因在于当模块具有高内聚性时,它自身形成了一个功能完整的单元。这样的模块对外的依赖较少,只需调用其接口即可实现功能,而不需要了解其内部复杂的细节

通过降低模块之间的相互关联和依赖,可以达到解耦的效果。这样,当一个模块发生变化时,不会影响到其他模块的核心功能,也不会产生过多的连锁反应,进一步促进了系统的稳定和解耦。
总的来说,高内聚和低耦合是软件设计中追求的目标,它们有助于提高系统的灵活性、可维护性和稳定性

首先,我会描述一个场景,然后提供两种设计方案:一种是低内聚的设计,另一种是高内聚的设计。我会用mermaid图例来展示这两种设计,并使用表格来对比它们的优缺点。

案例1:短信发送

低内聚设计方案

如果客户端直接集成对接三种客户端(移动、电信、联通),那将是一个低内聚的设计。在这种情况下,客户端需要处理与三个不同短信客户端的交互,这将导致客户端的职责过多,从而降低其内聚性。

发送短信
发送短信
发送短信
处理短信
处理短信
处理短信
客户端
移动短信客户端
电信短信客户端
联通短信客户端
移动
电信
联通
  1. 客户端:直接与移动、电信、联通的短信客户端交互。
  2. 移动/电信/联通短信客户端:分别接收来自客户端的短信,并处理与各自运营商相关的逻辑。

高内聚设计方案

这种设计模式属于中介者模式(Mediator Pattern)。中介者模式是一种行为设计模式,它通过引入一个中介对象(在这个案例中是短信门户)来封装一系列对象之间的交互。这种模式使得对象之间不再直接通信,而是通过中介者对象来进行交互,从而降低了对象之间的耦合度。
短信门户作为中介者,负责协调客户端和不同运营商网关之间的通信。客户端不需要直接知道网关的细节,只需要将短信发送给短信门户,由短信门户负责将短信转发给适当的网关。这样的设计使得系统更加灵活,易于扩展和维护。

发送短信
分发短信
分发短信
分发短信
发送短信
发送短信
发送短信
客户端
短信门户
移动网关
电信网关
联通网关
移动短信客户端
电信短信客户端
联通短信客户端
  1. 客户端:只负责发送短信到短信门户。
  2. 短信门户:负责接收客户端的短信,并根据运营商将短信分发到相应的短信网关。
  3. 短信网关:分别与移动、电信、联通的短信客户端交互,负责将短信发送到正确的运营商。

对比分析

特性低内聚设计高内聚设计
可维护性低:客户端需要处理与多个运营商客户端的交互,维护复杂度高。高:客户端只与短信门户交互,短信门户负责与运营商客户端的交互,维护简单。
可扩展性低:添加新运营商时,需要修改客户端代码。高:添加新运营商时,只需在短信门户中添加新网关,无需修改客户端代码。
可读性低:客户端承担了过多的职责,难以理解。高:每个组件都有明确的职责,易于理解和阅读。
内聚性低:客户端职责过多,内聚性低。高:每个组件都有明确的、单一的职责,内聚性高。
复用性低:客户端与特定运营商紧密耦合,难以复用。高:短信门户和短信网关可以独立于客户端和运营商客户端复用。

通过这个对比,我们可以看到高内聚设计在可维护性、可扩展性、可读性和复用性方面都优于低内聚设计。高内聚设计通过将功能分解为更小的、更专注的组件,使得系统更加模块化和灵活。

案例2:库存管理

假设我们正在设计一个简单的库存管理系统。这个系统需要处理两种主要操作:添加新商品到库存中和对现有商品进行库存更新。

低内聚设计方案

在低内聚的设计中,所有功能可能都集中在一个大的类或模块中。这个类负责添加新商品、更新库存、处理用户输入等所有任务。

manages
InventoryManager
-inventory: Map
+addProduct(product: Product)
+updateStock(productId: string, quantity: number)
+handleUserInput(input: string)
Product
+id: string
+name: string
+quantity: number

高内聚设计方案

在高内聚的设计中,我们使用了单一职责原则(Single Responsibility Principle),这是面向对象设计中的五个基本原则(SOLID)之一。单一职责原则指出,一个类应该只有一个引起它变化的原因。这意味着一个类应该只负责一项功能或职责。我们将功能分解为更小的、更专注于特定任务的类。例如,我们可以有一个类专门负责处理库存,另一个类专门处理用户输入。

manages
interacts with
InventoryManager
-inventory: Map
+addProduct(product: Product)
+updateStock(productId: string, quantity: number)
UserManager
+handleUserInput(input: string)
Product
+id: string
+name: string
+quantity: number

对比表格

特性低内聚设计高内聚设计
可维护性低:所有功能集中在一个类中,修改困难高:功能分散在多个类中,易于维护和修改
可扩展性低:添加新功能可能需要修改整个类高:可以轻松添加新类和功能,无需修改现有代码
可读性低:类过于庞大,难以理解高:每个类都有明确的职责,易于理解和阅读
内聚性低:类承担了过多的职责高:每个类都有明确的、单一的职责
复用性低:类过于特定,难以在其他场景中复用高:更通用的类可以在其他项目中复用

通过这个案例,我们可以看到高内聚设计在可维护性、可扩展性、可读性和复用性方面都优于低内聚设计。高内聚设计通过将功能分解为更小的、更专注的类,使得系统更加模块化和灵活。

http://www.lryc.cn/news/528643.html

相关文章:

  • 10.2 目录(文件夹)操作
  • LiteFlow Spring boot使用方式
  • OSCP:Windows 服务提权详解
  • 星火大模型接入及文本生成HTTP流式、非流式接口(JAVA)
  • 21.Word:小赵-毕业论文排版❗【39】
  • Python中的函数(上)
  • Windows11 安装poetry
  • 浅谈Linux 权限、压缩、进程与服务
  • 006 LocalStorage和SessionStorage
  • AJAX RSS Reader:技术解析与应用场景
  • Go优雅实现redis分布式锁
  • 本地部署deepseek模型步骤
  • (2025 年最新)MacOS Redis Desktop Manager中文版下载,附详细图文
  • C++ 写一个简单的加减法计算器
  • 计算机网络基础 - 链路层(3)
  • ray.rllib 入门实践-5: 训练算法
  • FPGA 使用 CLOCK_LOW_FANOUT 约束
  • 选择的阶段性质疑
  • 固有频率与模态分析
  • 数科OFD证照生成原理剖析与平替方案实现
  • CAN总线数据采集与分析
  • SpringSecurity:There is no PasswordEncoder mapped for the id “null“
  • ResNet 残差网络
  • CAPL编程常见问题与解决方案深度解析
  • 信号处理以及队列
  • Linux pkill 命令使用详解
  • react注意事项
  • 【开源免费】基于SpringBoot+Vue.JS在线考试学习交流网页平台(JAVA毕业设计)
  • 怎样在PPT中启用演讲者视图功能?
  • UE AController