# 接口隔离原则InterfaceSegregation
阅读量 loading
# 一、概念
# 1、定义
用多个专门的接口,而不使用单一的总接口,客户端不应该一类它不需要的接口。
# 2、注意事项
- 一个类对一个类的依赖应该建立在最小的接口上
- 建立单一接口,不要建立庞大臃肿的接口
- 尽量细化接口,接口中的方法尽量少
- 注意适度原则,一定要适度
# 3、优点
符合高内聚低耦合的设计思想,从而使得类具有很好的可读性、可扩展性和可维护性。
# 二、应用
先创建一个动物行为的接口:
public interface IAnimalAction {
void eat();
void fly();
void swim();
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
创建一个 Dog
类实现这个接口:
public class Dog implements IAnimalAction {
@Override
public void eat() {
}
@Override
public void fly() {
}
@Override
public void swim() {
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
狗因为没有飞的行为,所以它的 fly()
方法是一个空实现。
创建一个 Bird
类实现这个接口:
public class Bird implements IAnimalAction {
@Override
public void eat() {
}
@Override
public void fly() {
}
@Override
public void swim() {
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
鸟不会游泳,所以它的 swim()
方法也是一个空实现。
现在的类图:
为了避免差生过多的空实现,需要将接口再细分。
将上面的 IAnimalAction
拆分为3个接口:
public interface IFlyAnimalAction {
void fly();
}
1
2
3
4
2
3
4
public interface IEatAnimalAction {
void eat();
}
1
2
3
4
2
3
4
public interface ISwimAnimalAction {
void swim();
}
1
2
3
4
2
3
4
此时 Dog
类就可以修改为这样:
public class Dog implements IEatAnimalAction, ISwimAnimalAction {
@Override
public void eat() {
}
@Override
public void swim() {
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
只需要实现它自己需要实现的接口就行。
此时的类图:
此时 Dog
类所实现的接口的粒度更细,使接口互相隔离,如果后需要新需求是可以随意组装进行实现的。
这里是不是发现接口隔离原则和单一职责原则比较像呢。单一职责原则可以针对类、接口和方法,其中在接口级别强调的是在同一个接口中的职责要单一,也就是说可以有多个方法但是都是同一个职责;而接口隔离原则只针对接口来说,强调的是接口互相的隔离。