接口隔离
接口隔离原则 Interface Segregation Principle,ISP
- 客户端不应该依赖它不需要的接口
- 类间的依赖关系应该建立在最小的接口上
我的理解,在定义接口时方法应该尽量的少,且一个接口对于一个功能模块,避免出现某类实现接口,但仅使用接口中一个方法,或者避免出现一个接口中出现很多个方法,多个功能模块都去访问该接口。
所以,将接口尽量保持小颗粒度,不增加无用的方法,这样在实现接口或继承抽象类时,子类可以灵活扩展增加自己方法和实现自己的功能。如果基类的划分比较大的功能,就会导致子类扩展性变得比较差。
interface Reader{
read():void;
write():void;
trim():void;
}
Reader类赋予了read方法,write方法,trim方法,但如果某具体Reader子类只需要Read方法,而其他的方法对其时无用,却仍需要实现它们。这就违反了接口隔离原则。可以继续划分其颗粒,通过三个接口来代替原Reader接口,这三个接口的方法的粒度更小,对功能也是更清晰。
如何正确使用接口隔离原则
- 根据接口隔离原则拆解接口时,必须优先满足单一职责。因在某些业务场景中可能确实需要比较多方法,单一职责必然会与接口隔离原则产生冲突,接口应该是针对某功能模块去划分,即一个接口只服务一个字模块或业务逻辑
- 为依赖接口的类定制服务。即只提供调用者需要的方法,屏蔽不需要的方法
- 提高内聚,减少对外的交互,使接口用最少的方法完成最多事情
你会发现接口隔离原则 与 单一职责原则都是在强调如何正确去使用接口,但是它们之间时存在区别的:
- 单一职责要求类和接口职责单一,是对业务逻辑的划分
- 接口隔离要求接口中方法尽量少,是对接口的设计考虑