接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计中的一个重要原则,它属于SOLID原则之一。这个原则强调客户端(即接口的调用者)不应该被迫依赖于它们不使用的方法。换句话说,一个类对另一个类的依赖应该建立在最小的接口上。接口隔离原则的主要目的是使系统更加模块化,易于维护和扩展。
目录
接口隔离原则的核心思想
高内聚低耦合: 接口的设计应尽量做到高内聚,即接口中的方法都围绕一个共同的目标;同时接口间的耦合度要低,每个接口只承担单一的职责。
小接口优于大接口: 如果一个大接口中的部分方法被部分调用者使用,而另一部分方法被其他调用者使用,那么这个大接口就应该被拆分成几个小接口,让调用者只依赖它们需要的接口。
客户端不应依赖它不使用的方法: 一个接口如果有一些方法是不被某类使用的,那么这个接口对于这些类来说就是过于庞大,需要拆分成更小的接口。
接口隔离原则的优点
降低系统间的耦合度: 通过拆分接口,使得各个类之间的依赖关系更加明确,减少了不必要的依赖,从而降低了系统间的耦合度。
提高系统的灵活性:由于接口变小、职责单一,使得接口易于被替换和修改,提高了系统的灵活性。
增强系统的可维护性: 由于每个接口都相对较小,易于理解和维护,同时当接口需要修改时,影响的范围也较小。
应用场景
当一个接口中的方法被不同的类以不同的方式使用时: 这些方法应该被拆分到不同的接口中。
当系统的扩展性要求较高时: 通过遵循接口隔离原则,可以更容易地添加新的接口和实现类,而不需要修改现有的接口和实现类。
当系统的维护性要求较高时: 接口隔离原则使得接口更加清晰、简单,易于理解和维护。
接口隔离的比方
就违反 ISP 规定而言,下面的图片显示了一个大垃圾箱,用来扔掉各种垃圾,没有任何隔离措施。
使用 ISP,下面的图像是我们现实生活中隔离的一个很好的例子。
应用开发实例
下面是一个银行客户的例子,银行客户的类型如下:
企业客户: 为企业员工服务。
零售客户: 个人,日常银行业务。
潜在客户: 他们只是一个银行客户,还没有持有银行的产品,这只是一个记录,不同于公司和零售。
乍看起来还可以,但是对于有问题的客户来说,这是一个很大的接口,因为它强制客户端类实现不需要的方法。
如果所描述的潜在客户不持有任何产品,则必须实现产品属性。
一个潜在客户和一个零售客户都被迫拥有一个客户结构属性,但是在真实的场景中,一个公司客户拥有一个描述客户层次结构的客户结构。
潜在客户和零售客户都必须实现 BusinessType,但它只属于公司客户。
一个公司客户和一个潜在客户被迫实现一个"Occupation"属性,这个属性对于潜在客户来说不存在。
前面问题的一个解决方案是将胖接口分割成有意义的部分,换句话说,小接口,因此客户类型只实现它所需要的接口。
缺点
1、接口大爆炸: 如果接口拆分的非常细,可能会导致接口数量急剧增加,形成所谓的"接口大爆炸"。这会增加系统的复杂性和管理难度,因为开发者需要维护更多的接口文档和代码。
2、性能开销: 在某些情况下,细化的接口可能会导致性能下降。因为每次调用接口时都需要进行额外的类型检查和转换操作,这会增加系统的运行开销。特别是在高频调用的场景下,这种开销可能会更加明显。
3、开发成本增加: 随着接口数量的增加,开发成本也会相应增加。开发者需要为每个接口编写和维护代码,这增加了开发和维护的工作量。同时,过多的接口也可能导致团队成员之间的沟通成本上升。
4、理解和使用难度: 对于新加入项目的开发者来说,面对大量的细粒度接口可能会感到困惑和难以理解。他们需要花费更多的时间和精力来熟悉和掌握这些接口的使用方法和规则