设计原则 - 接口隔离原则

接口隔离原则:共性抽取同一个抽象类或接口中,特性单独抽取一个接口用于扩展,各个类建立自己的专用接口,而不是建立万能接口

含义

  • 接口隔离原则(Interface Segregation Principle,ISP)是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。接口隔离原则符合我们常说的高内聚低耦合的设计思想,从而使得类具有很好的可读性、可扩展性、可维护性

核心思想

  • 高内聚低耦合
  • 一个类不要去依赖它不需要的接口,就是类之间的依赖应该建立在最小接口上

优点

  • 接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性
  • 将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性、可扩展性和可维护性

接口隔离和单一职责原则的区别

  • 单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离
  • 单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口,主要针对抽象,针对程序整体框架的构建

实现方式

  • 一个类对一个类的依赖应该建立在最小的接口之上
  • 建立单一接口,提高内聚,减少对外交互,不要建立庞大臃肿的接口,使接口用最少的方法去完成最多的事情
  • 尽量细化接口,接口中的方法尽量少,但是要有限度,不是越少越好,一定要适度,接口过小则会造成接口数量过多,使设计复杂化,所以要为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
  • 多花时间去思考、要考虑业务模型,包括以后有可能发生变更的地方还要做一些预判。所以对于抽象、对业务模型的理解是非常重要的

案例

以动物行为举例,新建一个动物接口,添加吃、睡、飞、游、爬这些行为,在添加一个鱼类,实现动物接口

在这里插入图片描述

问题来了,鱼又不会飞,也不会爬行,那就没有比要实现啊这两个接口,那么就意味着鱼类要被迫依赖于它不使用的方法,即飞、爬行的方法,这也就违背了接口隔离原则

案例改进

抽象出动物的共性(吃、睡),然后把鱼不需要的接口单独抽象出来,即共性抽取同一个抽象类或接口中,特性单独抽取一个接口用于扩展。后续你需要哪些接口,你再实现哪些接口,这样就把接口范围缩小到最小

在这里插入图片描述

public interface Animal {
    
    
    void eat();
    void sleep();
}
public interface Birds{
    
    
    void fly();
}
public interface Fish {
    
    
    void swim();
}
public class Eagle implements Animal,Birds{
    
    

    @Override
    public void eat() {
    
    
        System.out.println("老鹰在吃东西");
    }

    @Override
    public void sleep() {
    
    
        System.out.println("老鹰在睡觉");
    }

    @Override
    public void fly() {
    
    
        System.out.println("老鹰在飞翔");
    }
}
public class Salmon implements Animal,Fish{
    
    

    @Override
    public void eat() {
    
    
        System.out.println("三文鱼在吃东西");
    }

    @Override
    public void sleep() {
    
    
        System.out.println("三文鱼在睡觉");
    }

    @Override
    public void swim() {
    
    
        System.out.println("三文鱼在游动");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42700109/article/details/132838516