一、什么是 接口隔离原则
(Interface Segregation Principle) ?
原则含义: 一个类对于另外一个类的依赖应该建立在最小的接口上
1. 接口隔离原则” 实际上它是建立在另一种设计原则之上(依赖倒置)的,即“面向接口编程,而 不是针对实现编程” 类之间的依赖不再是“真实类型“、而是 “表面类型” 。
2. “单一职责”原则要求类和接口职责单一,注重的是职责,是业务逻辑上的划分,
“接口隔离”原则要求方法要尽可能的少,是在接口设计上的考虑。
注意接口隔离原则的辩证关系
接口设计的粒度越小,系统越灵活,这是不争的事实,但是灵活的同时也带来了结构的复杂化,开发难度的增加,可维护性降低。所以这个度要进行权衡。
看例子:
interface A{
//定义了4种行为
void aa();
void ab();
void ac();
void ad();
}
class B implements A{
// 实际B只会实现 aa ab
void aa();
void ab();
void ac();
void ad();
}
Class C implements A{
//实际C只会实现 ac ad
void aa();
void ab();
void ac();
void ad();
}
public class School {
public static void main(String[] args) {
A bb = new B();
A cc = new C();
bb.aa();
cc.ac();
}
}
看似没什么问题、实际上、问题很多
1、 调用异常:调用人不清楚 bb cc 是否都实现了内部的方法、从外面调用看都实现了(但是你却没实现 -- 还需要花人力成本去了解内部具体实现逻辑是否实现)、会造成调用错误
2、 修改成本:C需要加一个行为功能、所以给 Interface A 添加接口、这样会造成B 也需要改动,
看似不需要实现、但是类多了之后、会造成小的改动需要修改很多类 - 设计明显不合理
interface A{
void aa();
void ab();
}
interface AL{
void ac();
void ad();
}
class B implements A{
void aa();
void ab();
}
Class C implements AL{
void ac();
void ad();
}
public class School {
public static void main(String[] args) {
A bb = new B();
AL cc = new C();
bb.aa();
cc.ac();
}
}