接口隔离原则(ISP)规定了:
- 一个类对另一个类的依赖应该建立在最小的接口上
- 实现类不应该实现其不需要的方法
接口隔离原则和单一职责原则很是相似,但是二者所针对内容却是不同的:
- 单一职责原则更注重的是【职责的单一】,而接口隔离原则主要针对的是【对接口依赖的隔离】
单一职责原则主要是约束类,【针对程序中的实现细节】,而接口隔离原则主要是针对【抽象和整体框架的构建】
优点:
拆分臃肿的接口为粒度更小的接口,提高系统的灵活性和可维护性
- 提高内聚,减少对外交互,降低耦合
- 更能够体现对象的层次
实现方法:
- 一个接口应该服务于一个业务逻辑或者一个子模块
- 只提供调用者需要的方法,屏蔽不需要的方法
- 使用接口最少的方法,完成最多的事情。
- 接口不应盲目拆分,需要深入了解业务逻辑,避免过度拆分
反例:兔子不能飞,也不能跑,却被迫实现了它不需要的方法
public static void main(String[] args) {
Animal rabbit = new Rabbit();
rabbit.fly(); // java.lang.RuntimeException: 兔子不会飞!
rabbit.run(); // 兔子在跑~
rabbit.swim(); // java.lang.RuntimeException: 兔子不会游泳!
}
//动物基类
interface Animal{
void fly();
void run();
void swim();
}
static class Rabbit implements Animal{
@Override
public void fly() {
throw new RuntimeException("兔子不会飞!");
}
@Override
public void run() {
System.out.println("兔子在跑~");
}
@Override
public void swim() {
throw new RuntimeException("兔子不会游泳!");
}
}
正例:正例,针对水,陆,空,三种类型的动物,分别拆分对应的接口,交由具体的实现去完成进一步的细节
public static void main(String[] args) {
Rabbit rabbit = new Rabbit();
rabbit.run(); // 兔子在跑~
Bird bird = new Bird();
bird.fly(); // 鸟在飞~
}
//动物基类
interface Animal{
}
interface FlyAnimal extends Animal{
void fly();
}
interface LandAnimal extends Animal{
void run();
}
static class Rabbit implements LandAnimal {
@Override
public void run() {
System.out.println("兔子在跑~");
}
}
static class Bird implements FlyAnimal{
@Override
public void fly() {
System.out.println("鸟在飞~");
}
}