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接口隔离原则的资料请关注我们其它相关文章!

(0)

相关推荐

  • 简单理解遵循接口隔离原则的Java设计模式编程

    定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法. 解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系.也就是采用接口隔离原则. 举例来说明接口隔离原则: 这个图的意思是:类A依赖接口I中的方法1.方法2.方法3,类B是对类A依赖的实现.类C依赖接口I中的方法1.方法4.方法5,类D是

  • 接口隔离原则_动力节点Java学院整理

    定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法. 解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系.也就是采用接口隔离原则. 举例来说明接口隔离原则: (图1  未遵循接口隔离原则的设计) 这个图的意思是:类A依赖接口I中的方法1.方法2.方法3,类B是对类A依赖的实现.类C依赖接

  • Java设计模式之接口隔离原则精解

    1.什么是接口隔离原则? 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口范围上. 2.对应代码 上面这张图呢,就违反了接口隔离原则.它对应的代码如下: package com.szh.principle.segregation; /** * */ interface Interface1 { void operation1(); void operation2(); void operation3(); void operation4(); void operati

  • java面向对象设计原则之接口隔离原则示例详解

    目录 概念 实现 拓展 概念 小接口原则,即每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分.如下图所示定义了一个接口,包含了5个方法,实现类A用到了3个方法.实现类B用到了3个方法,类图如下: 类A没有方法4.方法5,却要实现它:类B没有方法2.方法3,但还是要实现这两个方法,不符合接口隔离原则.改造为将其拆分为三个接口,实现方式改为下图所示,符合接口隔离原则: 实现 面向对象机制中一个类可以实现多个接口,通过多重继承分离,通过接口多继承(实现)来实现客户的需求,代码更加清

  • 举例说明Java设计模式编程中ISP接口隔离原则的使用

    Interface Segregation Principle,ISP接口隔离原则主张使用多个专门的接口比使用单一的总接口要好. 一个类对另外一个类的依赖性应当是建立在最小的接口上的. 一个接口代表一个角色,不应当将不同的角色都交给一个接口.没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染. "不应该强迫客户依赖于它们不用的方法.接口属于客户,不属于它所在的类层次结构."这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法

  • PHP面向对象五大原则之接口隔离原则(ISP)详解

    本文实例讲述了PHP面向对象五大原则之接口隔离原则(ISP).分享给大家供大家参考,具体如下: 设计应用程序的时候,如果一个模块包含多个子模块,那么我们应该小心对模块做出抽象.设想该模块由一个类实现,我们可以把系统抽象成一个接口.但是要添加一个新的模块扩展程序时,如果要添加的模块只包含原系统中的一些子模块,那么系统就会强迫我们实现接口中的所有方法,并且清寒要编写一些哑方法.这样的接口被称为肚胖接口或者被污染的接口,使用这样的接口将会给系统引入一些不当的行为,这些不当的行为可能导致不正确的结果,也

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

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 小知识点 相同点 不同点 定义 接口隔离原则(Interface Segregation Principle),又称为ISP原则,官方定义为 1.客户端不应该依赖它不需要的接口 2.类间的依赖关系应该建立在最小的接口上 简单点来讲就是在一个类中不要定义过多的方法,接口应该尽量简单细化 案例 需求 假设有这样一个案例场景,现在有一个接口Repair,给定他有三个能力,可以修汽车,修火车,修飞机, 两个实现类张师傅,李师傅分别具有这些能力,有一

  • C#实现六大设计原则之接口隔离原则

    接口隔离原则(ISP)定义: 客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来: 类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法. 解决方案: 将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系.也就是采用接口隔离原则. 举例来说明接口隔离原则: 类A依赖接口I中的方法1.方法2.方法3,类B是对类A依赖的实现. 类C依赖接口I中的方法1.方法4.

  • C#面向对象设计原则之接口隔离原则

    接口隔离原则(ISP) 定义:使用多个专门的接口比使用单一的总接口要好.即不要把鸡蛋都放到一个篮子里.好处:比较灵活.方便,不想实现的或不用实现的可以不实现.解释说明:大部分人都喜欢用一个接口把需要用到的方法全部声明出来,但是ISP建议我们使用多个专门的接口比使用单一的总接口要好,也就是一个接口里的方法多的话,实现起来不是很方便. 示例1: using System; using System.Collections.Generic; using System.Linq; using Syste

  • Java设计模式之责任链模式的示例详解

    目录 应用场景 实际代码案例 无模式情况下的代码 采用责任链模式优化代码 采用建造者+责任链模式优化代码 责任链模式优缺点 责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同,且内部自动维护下一个节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求位置,属于行为模式. 这里需要注意的是每个节点都能对对象进行一定的处理(也可以不处理),处理完成之后节点再进行判断还要进行后续处理还是说传递给下一个节点. 应用场景 首先举一个日常

  • Java设计模式之装饰模式原理与用法实例详解

    本文实例讲述了Java设计模式之装饰模式原理与用法.分享给大家供大家参考,具体如下: 装饰模式能在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.JDK中IO的设计就用到了装饰模式,通过过滤流对节点流进行包装来实现功能的扩展. 装饰模式的角色的组成: ① 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加工功能的对象.(InputStream.OutputStream) ② 具体构件(Concrete Co

  • 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:http://freshbrewedcode.com/derekgreer/2012/01/08/solid-javascript-the-interface-segregation-principle/ 注:这篇文章作者写得比较绕口,所以大叔理解得也比较郁闷,凑合着看吧,别深陷进去了 接口隔离原则的描述

  • Java设计模式之策略模式定义与用法详解

    本文实例讲述了Java策略模式定义与用法.分享给大家供大家参考,具体如下: 一. 定义: 定义一系列算法,把他们一个一个封装起来,并且使他们可以相互替换. 二. 优点: (1)上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系,因此上下文只需要知道他要使用某一个实现  Strategy接口类的实例,但不需要知道是哪个类. (2)策略模式满足开闭原则,当增加新的具体类时,不需要修改上下文类的代码,上下文即可以引用新的具体策略的实例. 三. 实例: 下面就通过一个问题

随机推荐