图解高内聚与低耦合

模块

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

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

耦合

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

好比模块A直接操做了模块B中数据, 则视为强耦合, 若A只是经过数据与模块B交互, 则视为弱耦合.apache

独立的模块便于扩展, 维护, 写单元测试, 若是模块之间重重依赖, 会极大下降开发效率. 编程

 内聚

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

若是有各类场景须要被引入到当前模块, 代码质量将变得很是脆弱, 这种状况建议拆分为多个模块.框架

低内聚的模块代码, 无论是维护, 扩展仍是重构都至关麻烦, 难如下手.函数

接口设计原则

好的接口应当知足设计模式六大原则, 不少设计模式, 框架都是基于高内聚低耦合这个出发点的.单元测试

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

举几个栗子

外观模式测试

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

 

桥接模式

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

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

适配器模式

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

须要抽出上层统一接口, 而后增长实现类, 对外暴露接口.

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

 

相关文章
相关标签/搜索