一、定义
接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口;
二、特点
根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干
三、案例
某公司开发人员针对某CRM系统的客户数据进行显示
(一)初始方案
设计了下图所示接口
各方法作用如下:
- dataRead():从文件中读取数据;
- transformToXML():将数据转换成XML格式;
- createChart():创建图表;
- displayChart():显示图表;
- createReport()用于创建文字报表,方法displayReport()用于显示文字报表
存在问题
在实际使用过程中发现该接口很不灵活,例如如果一个具体的数据显示类无须进行数据转换 (源文件本身就是XML格式),但由于实现了该接口,将不得不实现其中声明的transformToXML()方法(至少需要提供一个空实现);如果需要创建和显示图表,除了需实现 与图表相关的方法外,还需要实现创建和显示文字报表的方法,否则程序编译时将报错。
(二)ISP优化
在上图中,由于在接口CustomerDataDisplay中定义了太多方法,即该接口承担了太多职责,就导致了下面两个问题:
- 该接口的实现类很庞大,在不同的实现类中都不得不实现接口中定义的所有方法, 灵活性较差,如果出现大量的空方法,将导致系统中产生大量的无用代码,影响代码质量.
- 由于客户端针对大接口编程,将在一定程序上破坏程序的封装性,客户端看到了不 应该看到的方法,没有为客户端定制接口。
因此需要将该接口按照接口隔离原则和单一职责 原则进行重构,将其中的一些方法封装在不同的小接口中,确保每一个接口使用起来都较为 方便,并都承担某一单一角色,每个接口中只包含一个客户端(如模块或类)所需的方法即可
需要注意的是:
在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系 统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较 差,使用起来很不方便。一般而言,接口中仅包含为某一类用户定制的方法即可,不应该强 迫客户依赖于那些它们不用的方法