Java设计模式七大原则之接口隔离原则详解

 更新时间:2022年02月10日 10:28:55   作者:温故知新之java  
接口隔离原则(Interface Segregation Principle),又称为ISP原则,就是在一个类中不要定义过多的方法,接口应该尽量简单细化。本文将为大家具体介绍一下Java设计模式七大原则之一的接口隔离原则,需要的可以参考一下

定义

接口隔离原则(Interface Segregation Principle),又称为ISP原则,官方定义为

1.客户端不应该依赖它不需要的接口

2.类间的依赖关系应该建立在最小的接口上

简单点来讲就是在一个类中不要定义过多的方法,接口应该尽量简单细化

案例

需求

假设有这样一个案例场景,现在有一个接口Repair,给定他有三个能力,可以修汽车,修火车,修飞机, 两个实现类张师傅,李师傅分别具有这些能力,有一个4S店类,假设是需要张师傅来修汽车和修飞机,而另一个4s店类需要李师傅来修汽车和修火车

方案一

定义维修接口类Repair.java

/**
 * 维修类
 * @author:liyajie
 * @createTime:2022/1/29 17:00
 * @version:1.0
 */
public interface Repair {

    /**
     * 维修汽车
     * @author: liyajie
     * @date: 2022/1/29 17:03
     * @param
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    void car();

    /**
     * 维修火车
     * @author: liyajie
     * @date: 2022/1/29 17:03
     * @param
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    void train();

    /**
     * 维修飞机
     * @author: liyajie
     * @date: 2022/1/29 17:03
     * @param
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    void air();
}

维修李师傅类RepairLi.java

/**
 * 维修类
 * @author:liyajie
 * @createTime:2022/1/29 17:00
 * @version:1.0
 */
public class RepairLi implements Repair{


    @Override
    public void car() {
        System.out.println("李师傅修汽车");
    }

    @Override
    public void train() {
        System.out.println("李师傅修火车");
    }

    @Override
    public void air() {
        System.out.println("李师傅修飞机");
    }
}

维修王师傅类RepairWang.java

/**
 * 维修类
 * @author:liyajie
 * @createTime:2022/1/29 17:00
 * @version:1.0
 */
public class RepairWang implements Repair{

    @Override
    public void car() {
        System.out.println("王师傅修汽车");
    }

    @Override
    public void train() {
        System.out.println("王师傅修火车");
    }

    @Override
    public void air() {
        System.out.println("王师傅修飞机");
    }
}

4s店1

/**
 * 4s店1
 * @author:liyajie
 * @createTime:2022/1/29 17:07
 * @version:1.0
 */
public class S1Shop {

    /**
     * 修汽车
     * @author: liyajie
     * @date: 2022/1/29 17:10
     * @param repair
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public void car(Repair repair){
        repair.car();
    }

    /**
     * 修火车
     * @author: liyajie
     * @date: 2022/1/29 17:10
     * @param repair
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public void train(Repair repair){
        repair.train();
    }
}

4s店2

/**
 * 4s店2
 * @author:liyajie
 * @createTime:2022/1/29 17:07
 * @version:1.0
 */
public class S2Shop {
    /**
     * 修汽车
     * @author: liyajie
     * @date: 2022/1/29 17:10
     * @param repair
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public void car(Repair repair){
        repair.car();
    }

    /**
     * 修飞机
     * @author: liyajie
     * @date: 2022/1/29 17:10
     * @param repair
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public void air(Repair repair){
        repair.air();
    }
}

测试类1

/**
 * 测试类1
 * @author:liyajie
 * @createTime:2022/1/29 16:46
 * @version:1.0
 */
public class Test1 {
    public static void main(String[] args) {
        // 4s店1
        new S1Shop().car(new RepairLi());
        new S1Shop().train(new RepairLi());

        // 4s店2
        new S2Shop().car(new RepairWang());
        new S2Shop().air(new RepairWang());
    }
}

方案二

定义维修汽车接口

/**
 * 维修类
 * @author:liyajie
 * @createTime:2022/1/29 17:00
 * @version:1.0
 */
public interface RepairCar {

    /**
     * 维修汽车
     * @author: liyajie
     * @date: 2022/1/29 17:03
     * @param
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    void car();
}

定义维修火车类

/**
 * 维修类
 * @author:liyajie
 * @createTime:2022/1/29 17:00
 * @version:1.0
 */
public interface RepairTrain {

    /**
     * 维修火车
     * @author: liyajie
     * @date: 2022/1/29 17:03
     * @param
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    void train();
}

定义维修飞机类

/**
 * 维修类
 * @author:liyajie
 * @createTime:2022/1/29 17:00
 * @version:1.0
 */
public interface RepairAir {

    /**
     * 维修飞机
     * @author: liyajie
     * @date: 2022/1/29 17:03
     * @param
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    void air();
}

4s店1

/**
 * 4s店1
 * @author:liyajie
 * @createTime:2022/1/29 17:07
 * @version:1.0
 */
public class S1ShopNew {

    /**
     * 修汽车
     * @author: liyajie
     * @date: 2022/1/29 17:10
     * @param repairCar
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public void car(RepairCar repairCar){
        repairCar.car();
    }

    /**
     * 修火车
     * @author: liyajie
     * @date: 2022/1/29 17:10
     * @param repairTrain
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public void train(RepairTrain repairTrain){
        repairTrain.train();
    }
}

4s店2

/**
 * 4s店2
 * @author:liyajie
 * @createTime:2022/1/29 17:07
 * @version:1.0
 */
public class S2ShopNew {
    /**
     * 修汽车
     * @author: liyajie
     * @date: 2022/1/29 17:10
     * @param repairCar
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public void car(RepairCar repairCar){
        repairCar.car();
    }

    /**
     * 修飞机
     * @author: liyajie
     * @date: 2022/1/29 17:10
     * @param repairAir
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public void air(RepairAir repairAir){
        repairAir.air();
    }
}

测试类

/**
 * 测试类1
 * @author:liyajie
 * @createTime:2022/1/29 16:46
 * @version:1.0
 */
public class Test2 {
    public static void main(String[] args) {
        // 4s店1
        new S1ShopNew().car(new RepairLiNew());
        new S1ShopNew().train(new RepairLiNew());

        // 4s店2
        new S2ShopNew().car(new RepairWangNew());
        new S2ShopNew().air(new RepairWangNew());
    }
}

对比分析

方案一,违反了接口隔离原则,因为李师傅和王师傅都实现了维修接口的三个方法:修汽车,修火车,修飞机。但需求中并不需要这么多,只需要李师傅修汽车和火车,王师傅修汽车和飞机,依赖关系不是建立在最小接口上

方案二,遵守了接口隔离原则,对李师傅和王师傅类都进行了接口隔离,实现了各自的两个方法,避免了耦合

总结

通过上面两个案例,我们可以得到以下结论: 接口隔离原则就是当我一个类通过接口依赖(使用)另一个类的时候,要保证依赖的该接口是最小的,接口里面有方法用不到的,就进行隔离,而隔离的做法就是,就对原来接口进行拆分,拆分为最小粒度,来避免耦合。

小知识点

有没有发现接口隔离原则与我们上一篇的单一职责原则有点相似,来看下他们的相同点和不同点吧

相同点

都要求对结构进行拆分,都要求更小的粒度,都希望减少耦合

不同点

1.单一职责原则:类与接口职责单一,注重的是职责

2.接口隔离原则:要求我们尽量使用多个专门的接口,注重的是接口的设计

以上就是Java设计模式七大原则之接口隔离原则详解的详细内容,更多关于Java接口隔离原则的资料请关注脚本之家其它相关文章!

相关文章

  • Java RabbitMQ消息队列详解常见问题

    Java RabbitMQ消息队列详解常见问题

    消息队列是最古老的中间件之一,从系统之间有通信需求开始,就自然产生了消息队列。本文告诉什么是消息队列,为什么需要消息队列,常见的消息队列有哪些,RabbitMQ的部署和使用
    2022-07-07
  • MyBatisPlus深入探究映射匹配的兼容性

    MyBatisPlus深入探究映射匹配的兼容性

    在最近的工作中,碰到一个比较复杂的返回结果,发现简单映射已经解决不了这个问题了,只好去求助百度,学习mybatis映射匹配应该怎么写,将学习笔记结合工作碰到的问题写下本文,供自身查漏补缺,同时已被不时之需
    2022-08-08
  • SpringBoot接收各种各样参数的示例详解

    SpringBoot接收各种各样参数的示例详解

    参数映射准确来说是springmvc来帮我们干的活,但是由于springboot太过火爆,简化了springmvc相关配置文件,以至于很多人会误认为是springboot的功能,本文将给大家介绍SpringBoot接收各种各样参数,文中有详细的代码讲解,需要的朋友可以参考下
    2024-04-04
  • SpringBoot集成RocketMQ发送事务消息的原理解析

    SpringBoot集成RocketMQ发送事务消息的原理解析

    RocketMQ 的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致,这篇文章主要介绍了SpringBoot集成RocketMQ发送事务消息,需要的朋友可以参考下
    2022-06-06
  • IDEA中启动多个SpringBoot服务的实现示例

    IDEA中启动多个SpringBoot服务的实现示例

    本文主要介绍了IDEA中启动多个SpringBoot服务的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • idea导入项目爆红问题记录以及解决

    idea导入项目爆红问题记录以及解决

    这篇文章主要介绍了idea导入项目爆红问题记录以及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java取整与四舍五入

    Java取整与四舍五入

    本文详细讲解了Java取整与四舍五入,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Java项目如何打包成Jar的实现步骤

    Java项目如何打包成Jar的实现步骤

    一般情况下我们都是使用Java项目直接部署发布,有时需要我们将写好的项目打成jar包,方便后期调用,本文主要介绍了Java项目如何打包成Jar,感兴趣的可以了解一下
    2023-11-11
  • Javaweb EL自定义函数开发及代码实例

    Javaweb EL自定义函数开发及代码实例

    这篇文章主要介绍了Javaweb EL自定义函数开发及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 深入理解Java设计模式之装饰模式

    深入理解Java设计模式之装饰模式

    这篇文章主要介绍了JAVA设计模式之装饰模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2021-11-11

最新评论