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

高内聚(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

对比表格

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

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

相关推荐
YGGP8 小时前
【结构型模式】代理模式
设计模式
庄小焱13 小时前
设计模式——中介者设计模式(行为型)
设计模式
庄小焱16 小时前
设计模式——备忘录设计模式(行为型)
设计模式
庄小焱16 小时前
设计模式——代理设计模式(结构型)
设计模式
哆啦A梦的口袋呀16 小时前
基于Python学习《Head First设计模式》第三章 装饰者模式
python·学习·设计模式
哆啦A梦的口袋呀16 小时前
基于Python学习《Head First设计模式》第五章 单件模式
python·学习·设计模式
季鸢17 小时前
Java设计模式之备忘录模式详解
java·设计模式·备忘录模式
摘星编程21 小时前
工厂方法模式深度解析:从原理到应用实战
java·设计模式·软件工程·工厂方法模式
何中应21 小时前
【设计模式-4.7】行为型——备忘录模式
java·设计模式·备忘录模式
suixinger_lmh2 天前
功能结构整理
unity·设计模式·c#·源代码管理