快捷搜索:  汽车  科技

如何理解高内聚和低耦合:图解高内聚与低耦合

如何理解高内聚和低耦合:图解高内聚与低耦合模块之间存在依赖 导致改动可能会互相影响 关系越紧密 耦合越强 模块独立性越差.耦合


如何理解高内聚和低耦合:图解高内聚与低耦合(1)

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


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



耦合


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


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


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


如何理解高内聚和低耦合:图解高内聚与低耦合(2)


内聚


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


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


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


如何理解高内聚和低耦合:图解高内聚与低耦合(3)


接口设计原则



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


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


举几个栗子外观模式
为系统中多个子系统提供一致的对外调用 对客户端隐藏子系统细节 降低其与子系统的耦合.


如何理解高内聚和低耦合:图解高内聚与低耦合(4)


桥接模式


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


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


如何理解高内聚和低耦合:图解高内聚与低耦合(5)


适配器模式


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


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


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


如何理解高内聚和低耦合:图解高内聚与低耦合(6)


作者:大道方圆来源:www.cnblogs.com/xdecode/p/9393885.html- END -

如何理解高内聚和低耦合:图解高内聚与低耦合(7)


for (;;) 与 while (true),哪个更快?


面试官:new一个对象有哪两个过程?


这款多线程中间件,吊打 Redis!


用了 10 多年的 Tomcat 居然有bug !


IntelliJ IDEA 部署 Web 项目,终于搞懂了!


Java架构师日记

如何理解高内聚和低耦合:图解高内聚与低耦合(8)

扫描上面二维码发现更多精彩!

小贴士

返回 上一级 输入“基础” 等关键词获取相关资料推荐。



打卡!

猜您喜欢: