接口隔离原则(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{@Overridepublic void fly() {throw new RuntimeException("兔子不会飞!");}@Overridepublic void run() {System.out.println("兔子在跑~");}@Overridepublic 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 {@Overridepublic void run() {System.out.println("兔子在跑~");}}static class Bird implements FlyAnimal{@Overridepublic void fly() {System.out.println("鸟在飞~");}}
