作者:大道方圆cnblogs.com/xdecode/p/9393885.html

模块

模块就是从逻辑上将系统分解为更细微的部分, 分而治之, 复杂问题拆解为若干简单问题, 逐个解决。

耦合主要描述模块之间的关系, 内聚主要描述模块内部。 模块的粒度可大可小, 可以是函数, 类, 功能块等等。

耦合

模块之间存在依赖, 导致改动可能会互相影响, 关系越紧密, 耦合越强, 模块独立性越差。

比如模块A直接操作了模块B中数据, 则视为强耦合, 若A只是通过数据与模块B交互, 则视为弱耦合。

独立的模块便于扩展, 维护, 写单元测试, 如果模块之间重重依赖, 会极大降低开发效率。

高内聚低耦合的使用场景:彻底弄懂高内聚与低耦合(1)

内聚

模块内部的元素, 关联性越强, 则内聚越高, 模块单一性更强。 一个模块应当尽可能独立完成某个功能,

如果有各种场景需要被引入到当前模块, 代码质量将变得非常脆弱, 这种情况建议拆分为多个模块。

低内聚的模块代码, 不管是维护, 扩展还是重构都相当麻烦, 难以下手。

高内聚低耦合的使用场景:彻底弄懂高内聚与低耦合(2)

接口设计原则

好的接口应当满足设计模式六大原则, 很多设计模式, 框架都是基于高内聚低耦合这个出发点的。

  • 单一职责原则:一个类只负责一个功能领域中的相应职责。
  • 开闭原则:一个软件实体应当对扩展开放,对修改关闭。
  • 里氏代换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
  • 依赖倒转原则:抽象不应该依赖于细节, 细节应当依赖于抽象。 换言之, 要针对接口编程, 而不是针对实现编程。
  • 接口隔离原则:使用多个专门的接口, 而不使用单一的总接口, 即客户端不应该依赖那些它不需要的接口。
  • 迪米特法则: 一个软件实体应当尽可能少地与其他实体发生相互作用, 例如外观模式, 对外暴露统一接口。

举几个栗子

外观模式

为系统中多个子系统提供一致的对外调用, 对客户端隐藏子系统细节, 降低其与子系统的耦合。

高内聚低耦合的使用场景:彻底弄懂高内聚与低耦合(3)

外观模式参考:设计模式是什么鬼(门面)

桥接模式

JDBC中的把面向厂商的接口(Driver)和面向使用者的API(DriverManager)做了拆分隔离。

// 开发者只需要关注JDBC API, 无需关注不同数据库Driver接口实现 Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, password);

高内聚低耦合的使用场景:彻底弄懂高内聚与低耦合(4)

桥接模式参考:设计模式是什么鬼(桥接)

适配器模式

引入第三方库(hibernate, log4j), 不应该直接在代码中继承或者使用其实体类。

需要抽出上层统一接口, 然后增加实现类, 对外暴露接口。

// 代码与log4j强耦合, 不推荐 org.apache.log4j.Logger.getRootLogger().info("info"); // 底层可以随意更换log框架 FRLoggerFactory.getLogger().info("info");

高内聚低耦合的使用场景:彻底弄懂高内聚与低耦合(5)

,