接口

  • 实例接口 - Object Interface
    • 在Java中声明一个类,用new关键字产生一个实例,是对一个类型的事物的描述
    • 对于一个实例,需要遵循对应类的标准,从这个角度看Java中的类也是一种接口
  • 类接口 - Class Interface
    • 使用interface 关键字定义的接口

隔离

  • Clients should not be forced to depend upon interfaces that they don't use. - 客户端不应该依赖它不需要的接口
    • 客户端依赖它需要的接口,需要什么接口就提供什么接口,把不需要的剔除
    • 需要对接口进行细化保证其纯洁性
  • The dependency of one class to another one should depend ont he smallest possible interface. - 类间的依赖关系应该建立在最小的接口上
    • 要求最小的接口,要求接口细化接口纯洁

总定义:

建立单一接口,并且尽量细化,同时接口中的方法尽量少。

包含4层含义:

  • 接口要尽量小
    • 是接口隔离原则的核心定义,不能出现臃肿的接口
    • 但小是有限度的,不能违反单一职责原则
  • 接口高内聚
    • 提高接口、类、模块的处理能力,减少对外的交互
    • 要求在接口中尽量少公布public方法
    • 接口对外的承诺越少,对系统开发越有利,变更的风险也越少,也有利于降低成本
  • 定制服务
    • 单独为一个个体提供优良的服务,只提供访问者需要的方法
    • 针对不同服务商,按需提供需要的接口,有的是需要简单的搜索,有的需要复杂的搜索,如果放在一起,交叉使用会导致经常调用复杂的搜索导致性能下降
  • 接口设计是有限度的
    • 接口设计的粒度越小,系统越灵活,但会带来结构越复杂,开发难度越大,可维护性越低
    • 适度 - 没有固化的标准或可测量的标准,需要通过经验和常识判断

概览

优势:

设计的灵活性

劣势:

需要花费较多的时间和精力来进行设计和筹划

与单一职责原则相比:

审视角度不同

  • 单一职责:类和接口职责单一,注重的是职责,是业务逻辑上的划分
  • 接口隔离:要求接口的方法尽量少。给每个模块应该分别提供单一接口。

最佳实践

接口隔离原则是对接口的定义,同时也是对类的定义,接口和类尽量使用原子接口或原子类来组装

贯彻使用接口隔离原则最好的方法是:一个接口一个方法

如何划分原子

  • 一个接口只服务于一个子模块或业务逻辑
  • 通过业务逻辑压缩接口中的public方法,接口时常去回顾
  • 已经被污染了的接口,尽量去修改,若变更的风险较大,则采用适配器模式进行转化处理
  • 了解环境,拒绝盲从。别人分的不一定是合适的。

如何正确地使用接口隔离原则

根据经验和常识决定接口的粒度大小

  • 接口粒度太小,导致接口数量剧增;
  • 接口粒度太大,灵活性降低,无法提供定制服务,容易误用。

读《设计模式之禅》第四章 接口隔离原则