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

 更新时间:2022年02月08日 11:40:20   作者:张起灵-小哥  
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。本篇介绍设计模式七大原则之一的接口隔离原则

1.什么是接口隔离原则?

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口范围上。

2.对应代码

上面这张图呢,就违反了接口隔离原则。它对应的代码如下:👇👇👇

package com.szh.principle.segregation;
 
/**
 *
 */
interface Interface1 {
    void operation1();
    void operation2();
    void operation3();
    void operation4();
    void operation5();
}
 
class B implements Interface1 {
    public void operation1() {
        System.out.println("B 实现了 operation1");
    }
    public void operation2() {
        System.out.println("B 实现了 operation2");
    }
    public void operation3() {
        System.out.println("B 实现了 operation3");
    }
    public void operation4() {
        System.out.println("B 实现了 operation4");
    }
    public void operation5() {
        System.out.println("B 实现了 operation5");
    }
}
 
class D implements Interface1 {
    public void operation1() {
        System.out.println("D 实现了 operation1");
    }
    public void operation2() {
        System.out.println("D 实现了 operation2");
    }
    public void operation3() {
        System.out.println("D 实现了 operation3");
    }
    public void operation4() {
        System.out.println("D 实现了 operation4");
    }
    public void operation5() {
        System.out.println("D 实现了 operation5");
    }
}
 
class A { //A 类通过接口Interface1 依赖(使用) B类,但是只会用到1,2,3方法
    public void depend1(Interface1 i) {
        i.operation1();
    }
    public void depend2(Interface1 i) {
        i.operation2();
    }
    public void depend3(Interface1 i) {
        i.operation3();
    }
}
 
class C { //C 类通过接口Interface1 依赖(使用) D类,但是只会用到1,4,5方法
    public void depend1(Interface1 i) {
        i.operation1();
    }
    public void depend4(Interface1 i) {
        i.operation4();
    }
    public void depend5(Interface1 i) {
        i.operation5();
    }
}
 
public class Segregation1 {
    public static void main(String[] args) {
        A a = new A();
        a.depend1(new B()); // A类通过接口去依赖B类
        a.depend2(new B());
        a.depend3(new B());
 
        C c = new C();
        c.depend1(new D()); // C类通过接口去依赖(使用)D类
        c.depend4(new D());
        c.depend5(new D());
    }
}

代码虽然很长,但是不难理解。A类依赖了B类,但是只会用到顶级接口中的1、2、3这三个方法;而C类依赖了D类,但是只会用到顶级接口中的1、4、5这三个方法,也就是说在A和B这两个类的层面上而言,和顶级接口中的4、5两个方法是没什么关联的,那么B类在实现顶级接口的时候就没必要重写4、5这两个方法了。但是这里有一个问题就是顶级接口中包括了1到5这五个方法,你如果实现这个接口就必须重写这五个方法,那么我们就可以考虑将顶级接口拆分成多个接口,需要用到哪个就实现哪个,这也就是所谓的接口隔离了。

3.改进代码

经过上面的一番叙述,我们可以将代码改写成下面的形式。

即将顶级接口拆分成3个小接口,B、D两个类根据实际情况该实现哪个接口就实现哪个接口(因为这五个方法已经被分开了)。

package com.szh.principle.segregation.improve;
 
/**
 *
 */
interface Interface1 {
    void operation1();
}
 
interface Interface2 {
    void operation2();
    void operation3();
}
 
interface Interface3 {
    void operation4();
    void operation5();
}
 
class B implements Interface1, Interface2 {
    public void operation1() {
        System.out.println("B 实现了 operation1");
    }
 
    public void operation2() {
        System.out.println("B 实现了 operation2");
    }
 
    public void operation3() {
        System.out.println("B 实现了 operation3");
    }
}
 
class D implements Interface1, Interface3 {
    public void operation1() {
        System.out.println("D 实现了 operation1");
    }
 
    public void operation4() {
        System.out.println("D 实现了 operation4");
    }
 
    public void operation5() {
        System.out.println("D 实现了 operation5");
    }
}
 
class A { // A 类通过接口Interface1,Interface2 依赖(使用) B类,但是只会用到1,2,3方法
    public void depend1(Interface1 i) {
        i.operation1();
    }
 
    public void depend2(Interface2 i) {
        i.operation2();
    }
 
    public void depend3(Interface2 i) {
        i.operation3();
    }
}
 
class C { // C 类通过接口Interface1,Interface3 依赖(使用) D类,但是只会用到1,4,5方法
    public void depend1(Interface1 i) {
        i.operation1();
    }
 
    public void depend4(Interface3 i) {
        i.operation4();
    }
 
    public void depend5(Interface3 i) {
        i.operation5();
    }
}
 
public class Segregation2 {
    public static void main(String[] args) {
        A a = new A();
        a.depend1(new B()); // A类通过接口去依赖B类
        a.depend2(new B());
        a.depend3(new B());
 
        C c = new C();
        c.depend1(new D()); // C类通过接口去依赖(使用)D类
        c.depend4(new D());
        c.depend5(new D());
    }
}

4.接口隔离原则总结

  1. 类A通过接口Interface1依赖类B,类C通过接口Interfacel依赖类D,如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法。
  2. 将接口Interface1拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

到此这篇关于Java设计模式之接口隔离原则精解的文章就介绍到这了,更多相关Java 接口隔离原则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis insert foreach循环插入方式

    mybatis insert foreach循环插入方式

    这篇文章主要介绍了mybatis insert foreach循环插入方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java编程BigDecimal用法实例分享

    Java编程BigDecimal用法实例分享

    这篇文章主要介绍了Java编程BigDecimal用法实例分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 解决IDEA安装插件搜索不到插件的问题

    解决IDEA安装插件搜索不到插件的问题

    这篇文章主要介绍了解决IDEA安装插件搜索不到插件的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 详解Spring容器的使用流程

    详解Spring容器的使用流程

    今天给大家带来的是关于Java的相关知识,文章围绕着Spring容器的使用流程展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java 代理(Proxy)的原理及应用

    Java 代理(Proxy)的原理及应用

    动态代理技术就是用来产生一个对象的代理对象的。 我们在开发中之所以要产生一个对象的代理对象,主要用于拦截对真实业务对象的访问。本文主要介绍了Java 代理的使用,感兴趣的可以了解一下
    2021-05-05
  • java数据结构与算法之简单选择排序详解

    java数据结构与算法之简单选择排序详解

    这篇文章主要介绍了java数据结构与算法之简单选择排序,结合实例形式分析了选择排序的原理、实现方法与相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • 详解java中的synchronized关键字

    详解java中的synchronized关键字

    这篇文章主要介绍了java中的synchronized关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • SpringBoot参数校验之@Valid与@Validated的用法与场景

    SpringBoot参数校验之@Valid与@Validated的用法与场景

    这篇文章主要介绍了SpringBoot参数校验的用法与场景,在实际开发中,参数校验是保证接口安全性和数据完整性的重要手段,Spring Boot提供了@Valid和@Validated两个核心注解来实现参数校验,但许多开发者对它们的区别和使用场景存在疑惑,需要的朋友可以参考下
    2025-02-02
  • IntelliJ IDEA运行SpringBoot项目的详细步骤

    IntelliJ IDEA运行SpringBoot项目的详细步骤

    这篇文章主要介绍了IntelliJ IDEA如何运行SpringBoot项目,步骤一配置maven,步骤二配置JDK环境,紧接着通过步骤三检查数据库的配置,最后一步数据库连接,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Curator实现zookeeper的节点监听详解

    Curator实现zookeeper的节点监听详解

    这篇文章主要介绍了Curator实现zookeeper的节点监听详解,Curtor框架中一共有三个实现监听的方式,一种是NodeCache监听指定节点,一种是pathChildrenCache监听子节点,一种是TreeCache可以监控所有节点 相当于以上两种的合集,需要的朋友可以参考下
    2023-12-12

最新评论