02.接口隔离原则(Interface Segregation Principle)

一言

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

为什么要有接口隔离原则

反例设计

在这里插入图片描述

反例代码

public class Segregation1 {
}

interface Interface1 {
    void operation1();
    void operation2();
    void operation3();
    void operation4();
    void operation5();
}

class B implements Interface1{

    @Override
    public void operation1() {
        System.out.println("B实现了 operation1");
    }

    @Override
    public void operation2() {
        System.out.println("B实现了 operation2");
    }

    @Override
    public void operation3() {
        System.out.println("B实现了 operation3");
    }

    @Override
    public void operation4() {
        System.out.println("B实现了 operation4");
    }

    @Override
    public void operation5() {
        System.out.println("B实现了 operation5");
    }
}

class D implements Interface1{

    @Override
    public void operation1() {
        System.out.println("D实现了 operation1");
    }

    @Override
    public void operation2() {
        System.out.println("D实现了 operation2");
    }

    @Override
    public void operation3() {
        System.out.println("D实现了 operation3");
    }

    @Override
    public void operation4() {
        System.out.println("D实现了 operation4");
    }

    @Override
    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();
    }
}

针对类A,通过接口Interface1依赖类B,类C通过Interface1依赖类D,如果接口Interface1对于类A和类C来说不是最小的接口,那么对于类B和类D来说,他们就必须去实现原本他们不需要的方法。这显然是有优化空间的。

在上图中,A通过Interface1依赖(使用)B,但A中实际上只会用到1,2,3三个方法;而C通过Interface1依赖(使用)D,但C中只会用到接口1,4,5三个方法

设计提升

按接口隔离原则应当这样处理:
将接口Interface1拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。
核心其实就是一个字:拆!
实际上上例中的Interface1完全可以拆分成三个接口,这样一来底层按需取用也降低了耦合性。

优化结构

在这里插入图片描述

代码详解

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());
    }
}

interface Interface1 {
    void operation1();
}

interface Interface2 {
    void operation2();
    void operation3();
}

interface Interface3 {
    void operation4();
    void operation5();
}

class B implements Interface1,Interface2{
    @Override
    public void operation1() {
        System.out.println("B实现了 operation1");
    }

    @Override
    public void operation2() {
        System.out.println("B实现了 operation2");
    }

    @Override
    public void operation3() {
        System.out.println("B实现了 operation3");
    }
}

class D implements Interface1,Interface3{

    @Override
    public void operation1() {
        System.out.println("D实现了 operation1");
    }

    @Override
    public void operation4() {
        System.out.println("D实现了 operation4");
    }

    @Override
    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();
    }
}

头脑风暴

讲了这么多,为啥感觉接口隔离原则和单一职责原则说的是一个事呢?

其实描述的并不是一个事情,
单一职责原则原注重的是职责,而接口隔离原则注重对接口依赖的隔离。单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口,主要针对抽象,针对程序整体框架的构建。
我们可以再参考一下ChatGPT的表述:
在这里插入图片描述
也就是说,单一职责原则旨在保持类的“内聚”,使得每个类的职责更加明确,更加专注。而接口隔离原则关注点在接口上,它要求接口设计遵循一定的原子性,减少架构层面不必要的耦合可能


关注我,共同进步,每周至少一更。——Wayne

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/164993.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VUE(一)

1.vue简介 英文官网: Vue.js - The Progressive JavaScript Framework | Vue.js 中文官网: Vue.js - 渐进式 JavaScript 框架 | Vue.js 2.Vue的特点 3.初识VUE 在官网下载VUE.js,有两个版本&#xff0c;一个开发一个生产 <!DOCTYPE html> <html lang"en"…

如何使用贝锐花生壳内网穿透远程访问JupyterNotebook?

在数据科学领域&#xff0c;Jupyter Notebook 已成为处理数据的必备工具。 其用途包括数据清理和探索、可视化、机器学习和大数据分析。Jupyter Notebook的安装非常简单&#xff0c;如果你是小白&#xff0c;那么建议你通过安装Anaconda来解决Jupyter Notebook的安装问题&#…

打开游戏提示xapofx1_5.dll丢失如何修复?xapofx1_5.dll缺失的修复教程分享

xapofx1_5.dll是一个重要的Windows系统文件&#xff0c;它主要负责处理图形渲染和多媒体功能。如果在计算机中找不到xapofx1_5.dll&#xff0c;可能会导致程序无法正常运行。下面是关于xapofx1_5.dll丢失的4个修复方法以及xapofx1_5.dll的作用和丢失原因的介绍。 一、xapofx1_…

YOLOv8改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FoucsIoU等损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其Focus变种 一、本文介绍 本文给…

算法之冒泡排序

算法之冒泡排序 冒泡排序Bubble Sort 交换排序相邻元素两两比较大小&#xff0c;有必要则交换。元素越小或越大&#xff0c;就会在数列中慢慢的交换并“浮”向顶端&#xff0c;如同水泡咕嘟咕嘟往上冒。 核心算法 排序算法&#xff0c;一般都实现为就地排序&#xff0c;输出…

Oracle主备切换,ogg恢复方法(集成模式)

前言: 文章主要介绍Oracle数据库物理ADG主备在发生切换时(switchover,failover)&#xff0c;在主库运行的ogg进程(集成模式)如何进行恢复。 测试恢复场景&#xff0c;因为集成模式不能在备库配置&#xff0c;所以场景都是基于主库端: 1 主备发生switchover切换&#xff0c;主库…

Vue3--Vue Router详解--学习笔记

1. 认识vue-router Angular的ngRouter React的ReactRouter Vue的vue-router Vue Router 是Vue.js的官方路由&#xff1a; 它与Vue.js核心深度集成&#xff0c;让Vue.js构建单页应用&#xff08;SPA&#xff09;变得非常容易&#xff1b;目前Vue路由最新的版本是4.x版本。 v…

图像处理01 小波变换

一.为什么需要离散小波变换 连续小波分解&#xff0c;通过改变分析窗口大小&#xff0c;在时域上移动窗口和基信号相乘&#xff0c;最后在全时域上整合。通过离散化连续小波分解可以得到伪离散小波分解&#xff0c; 这种离散化带有大量冗余信息且计算成本较高。 小波变换的公…

Java拼图

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import jav…

LeetCode - 622. 设计循环队列(C语言,顺序存储结构,配图)

622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 设计循环队列&#xff0c;我们可以从顺序结构和链式结构来考虑&#xff0c;但因为链式结构实现起来较为复杂&#xff0c;不易理解&#xff0c;且主流使用顺序存储&#xff0c;所以本文就是用顺序存储结构实现。 因为…

《轻松入门!快速安装PyCharm,打造高效Python编程环境》

「Pycharm安装包和相关插件&#xff08;Windows 64位&#xff09;」https://www.aliyundrive.com/s/jByv6vjShVz 提取码: 1234 视频教程&#xff1a;https://www.douyin.com/video/7303106933521763596?previous_pageapp_code_link 第一步&#xff1a;找到一起下载的Pycharm安…

Linux:安装软件的两种方式rpm和yum

一、rpm方式 1、简单介绍 RPM是RedHat Package Manager的缩写&#xff0c;它是Linux上打包和安装的工具。通过rpm打包的文件扩展名是.RPM。这个安装包就类似Windows系统中的.exe文件。rpm工具实现Linux上软件的离线安装。 2、软件相关信息的查询命令 查询Linux系统上所有已…

数睿通2.0数据接入、数据开发、系统权限、集群监控全面升级

引言 数睿通 2.0 数据中台迎来了11月份的更新&#xff0c;感谢大家的支持&#xff0c;本次更新主要包括以下内容&#xff1a; 数据库支持 MongoDB数据接入支持 MongoDB&#xff0c;支持自定义 SQL 采集&#xff0c;支持停止运行中的任务数据生产支持 FlinkJar 任务&#xff0…

吴恩达《机器学习》9-1-9-3:反向传播算法、反向传播算法的直观理解

一、正向传播的基础 在正向传播中&#xff0c;从神经网络的输入层开始&#xff0c;通过一层一层的计算&#xff0c;最终得到输出层的预测结果。这是一种前向的计算过程&#xff0c;即从输入到输出的传播。 二、反向传播算法概述 反向传播算法是为了计算代价函数相对于模型参数…

LeetCode【13】罗马数字转整数

题目&#xff1a; 思路&#xff1a; 第十二题的逆运算&#xff0c;方法同理。需要注意的是IV、IX、XL、XC、CD、CM这六种特殊的情况。正常情况下每个字符找到对应的数值累加&#xff0c;这六种特殊字符都是左边的数值比右边的数值小。 这里以IV举例&#xff0c;IV对应数字是1和…

EMNLP2023 | 基于显式证据推理的few-shot关系抽取CoT

深度学习自然语言处理 原创作者&#xff1a;wkk 论文&#xff1a;Chain of Thought with Explicit Evidence Reasoning for Few-shot Relation Extraction地址&#xff1a;https://arxiv.org/abs/2311.05922 摘要 Few-shot关系提取涉及使用有限数量的注释样本识别文本中两个特定…

数据结构与算法之美学习笔记:22 | 哈希算法(下):哈希算法在分布式系统中有哪些应用?

目录 前言应用五&#xff1a;负载均衡应用六&#xff1a;数据分片应用七&#xff1a;分布式存储解答开篇 & 内容小结 前言 本节课程思维导图 今天&#xff0c;我们再来看剩余三种应用&#xff1a;负载均衡、数据分片、分布式存储。你可能已经发现&#xff0c;这三个应用都…

gitlab环境准备

1.准备环境 gitlab只支持linux系统&#xff0c;本人在虚拟机下使用Ubuntu作为操作系统&#xff0c;gitlab镜像要使用和操作系统版本对应的版本&#xff0c;(ubuntu18.04,gitlab-ce_13.2.3-ce.0_amd64 .deb) book100ask:/$ lsb_release -a No LSB modules are available. Dist…

YARN,ZOOKEERPER--学习笔记

1&#xff0c;YARN组件 1.1YARN简介 YARN表示分布式资源调度&#xff0c;简单地说&#xff0c;就是&#xff1a;以分布式技术完成资源的合理分配&#xff0c;让MapReduce能高效完成计算任务。 YARN是Hadoop核心组件之一&#xff0c;用于提供分布式资源调度服务。 而在Hadoop …

公司内部网络架设悟空CRM客户管理系统 cpolar无需公网IP实现内网,映射端口外网访问

1、什么是内网穿透&#xff1f; 内网穿透&#xff0c;即内网映射&#xff0c;内网IP端口映射到外网的过程。是一种主动的操作&#xff0c;需要本人一些内网的权限。比如在公司自己电脑&#xff0c;将办公OA发布到互联网&#xff0c;然后提供外网在家或出差在外连接访问。 可以…