接口隔离原则(ISP)规定了:

    1. 一个类对另一个类的依赖应该建立在最小的接口上
    2. 实现类不应该实现其不需要的方法

    接口隔离原则和单一职责原则很是相似,但是二者所针对内容却是不同的:

    1. 单一职责原则更注重的是【职责的单一】,而接口隔离原则主要针对的是【对接口依赖的隔离】
    2. 单一职责原则主要是约束类,【针对程序中的实现细节】,而接口隔离原则主要是针对【抽象和整体框架的构建】

      优点:

    3. 拆分臃肿的接口为粒度更小的接口,提高系统的灵活性和可维护性

    4. 提高内聚,减少对外交互,降低耦合
    5. 更能够体现对象的层次

    实现方法:

    1. 一个接口应该服务于一个业务逻辑或者一个子模块
    2. 只提供调用者需要的方法,屏蔽不需要的方法
    3. 使用接口最少的方法,完成最多的事情。
    4. 接口不应盲目拆分,需要深入了解业务逻辑,避免过度拆分

    反例:兔子不能飞,也不能跑,却被迫实现了它不需要的方法

    1. public static void main(String[] args) {
    2. Animal rabbit = new Rabbit();
    3. rabbit.fly(); // java.lang.RuntimeException: 兔子不会飞!
    4. rabbit.run(); // 兔子在跑~
    5. rabbit.swim(); // java.lang.RuntimeException: 兔子不会游泳!
    6. }
    7. //动物基类
    8. interface Animal{
    9. void fly();
    10. void run();
    11. void swim();
    12. }
    13. static class Rabbit implements Animal{
    14. @Override
    15. public void fly() {
    16. throw new RuntimeException("兔子不会飞!");
    17. }
    18. @Override
    19. public void run() {
    20. System.out.println("兔子在跑~");
    21. }
    22. @Override
    23. public void swim() {
    24. throw new RuntimeException("兔子不会游泳!");
    25. }
    26. }

    正例:正例,针对水,陆,空,三种类型的动物,分别拆分对应的接口,交由具体的实现去完成进一步的细节

    1. public static void main(String[] args) {
    2. Rabbit rabbit = new Rabbit();
    3. rabbit.run(); // 兔子在跑~
    4. Bird bird = new Bird();
    5. bird.fly(); // 鸟在飞~
    6. }
    7. //动物基类
    8. interface Animal{
    9. }
    10. interface FlyAnimal extends Animal{
    11. void fly();
    12. }
    13. interface LandAnimal extends Animal{
    14. void run();
    15. }
    16. static class Rabbit implements LandAnimal {
    17. @Override
    18. public void run() {
    19. System.out.println("兔子在跑~");
    20. }
    21. }
    22. static class Bird implements FlyAnimal{
    23. @Override
    24. public void fly() {
    25. System.out.println("鸟在飞~");
    26. }
    27. }