当前位置: 首页 > news >正文

软件设计原则-接口隔离原则讲解以及代码示例

接口隔离原则

一,介绍

1.前言

接口隔离原则(Interface Segregation Principle,ISP)是面向对象设计中的一个原则,提倡使用多个专门的接口,而不使用单一的大接口。它最早由Robert C. Martin在其《敏捷软件开发:原则、模式与实践》一书中提出。

接口隔离原则的核心思想是:客户端不应该依赖于它不需要的接口。也就是说,一个类或模块不应该强迫它的用户去依赖无用的接口。相反,应该将大接口拆分成多个小接口,符合客户端的需求,使客户端只依赖于它真正需要的接口。

接口隔离原则的目标是降低类或模块之间的耦合度,提高代码的可维护性、可扩展性和可测试性。通过使用多个专门的接口,我们可以避免类或模块之间出现不必要的依赖关系,减少对无用接口的实现或调用,从而降低了修改和维护的成本。

2.何时使用接口隔离原则

  1. 接口职责不一致:当一个接口承担了多个不相关的职责时,可能导致实现该接口的类需要实现它们不需要的方法,这违反了接口隔离原则。此时,可以考虑将该接口拆分为多个细粒度的接口,每个接口只包含相关的方法。由于客户端仅依赖于它们需要的接口,这样可以减少对无关方法的依赖性,提高代码的灵活性和可维护性。

  2. 接口庞大臃肿:如果一个接口包含大量的方法,其庞大的接口定义可能会给实现类带来负担。在这种情况下,可以将接口分解为多个更小的接口,每个接口都有一个清晰的责任。这样可以降低实现类的复杂度,并且有助于提高代码的可读性、可维护性和可扩展性。

  3. 接口实现冗余:有时候一个类只需要使用接口的部分方法,但由于接口的设计不合理,需要实现整个接口。这样会导致实现类冗余地实现了一些不需要的方法。通过采用接口隔离原则,可以将接口拆分为多个更小的接口,使得实现类只需实现自己需要的接口,避免了冗余代码的产生。

  4. 接口变更频繁:当一个接口发生变化时,所有依赖该接口的类都需要进行相应的修改,这可能带来大量的工作量。接口隔离原则可以将接口细化为更小的粒度,从而使得接口的变更影响范围更小,降低了耦合性,提高了系统的稳定性和可维护性。

二,代码示例

为了更好地理解接口隔离原则,我们可以通过一个例子来说明:

假设我们正在设计一个文件系统的接口,其中包含读取文件、写入文件、删除文件等操作。我们可以设计一个名为`FileSystem`的接口来表示文件系统,如下所示:

interface FileSystem {void read(String fileName);void write(String fileName, String content);void delete(String fileName);
}

在这个设计中,`FileSystem`接口包含了读取、写入和删除文件三个操作。但是,如果我们有一个只需要读取文件的客户端,它却不需要写入或删除文件的功能,那么它就不得不实现空方法或抛出异常,这违反了接口隔离原则。

为了符合接口隔离原则,我们可以将大接口拆分成多个小接口,每个接口只包含一个职责或功能,如下所示:

interface Readable {void read(String fileName);
}interface Writable {void write(String fileName, String content);
}interface Deletable {void delete(String fileName);
}

通过拆分接口,我们可以根据客户端的需求给予其相应的小接口,避免了不必要的方法实现或调用。对于只需要读取文件的客户端,它只需要实现`Readable`接口即可,无需关心其他不需要的操作。

总结起来,接口隔离原则要求我们设计多个专门的接口,而不是使用单个臃肿的大接口。通过拆分接口,我们能够减少类或模块之间的耦合度,提高代码的灵活性和可维护性。符合接口隔离原则的设计能够更好地满足客户端的需求,减少不必要的方法实现或调用,使系统更加稳定和可靠。

三,优缺点

接口隔离原则(Interface Segregation Principle,ISP)是面向对象设计中的一个原则,它强调客户端不应该强制依赖于它们不需要使用的接口。接口隔离原则具有以下优点和缺点:

优点:


1. 提高代码的灵活性:接口隔离原则通过将大型接口拆分为多个小型接口,使得客户端只需依赖于自己需要的接口,从而避免了不必要的依赖和耦合。这提高了代码的灵活性,使得系统更容易修改、扩展和维护。

2. 提高代码的可读性和可理解性:借助接口隔离原则,每个接口都有明确的职责和功能。这使得代码的结构更加清晰,减少了冗余方法和不必要的复杂性。开发人员可以更轻松地理解接口的用途和作用,提高了代码的可读性和可理解性。

3. 降低变更的风险:当需要修改一个接口时,由于接口已经被细化为多个小型接口,变更的影响范围相对较小。这降低了引入错误和破坏现有功能的风险,使得系统更加稳定可靠。

4. 增强代码的复用性:接口隔离原则使得每个接口都具有单一的职责,这使得接口更加精确地描述了特定的功能和行为。这样,其他模块或类可以更容易地复用这些小型接口,提高了代码的复用性。

缺点:


1. 接口数量增加:通过遵循接口隔离原则,系统中可能会出现更多的接口。这增加了接口的数量,使得接口的管理和维护工作变得更加复杂。需要在设计时权衡接口数量的增加和维护的成本。

2. 接口拆分所带来的复杂性:如果接口隔离不当,将接口拆分为过多的细粒度接口可能会导致类之间的关系变得复杂。在设计过程中,需要仔细考虑接口的划分方式,确保接口的粒度适中,避免过度拆分导致代码的繁琐性。

总结起来,接口隔离原则通过细化接口,使其职责更加明确和一致,能够提高代码的灵活性、可读性和可理解性,降低变更的风险,增强代码的复用性。然而,需要注意接口数量的增加和接口拆分带来的复杂性问题,使得设计合理且易于维护。

相关文章:

软件设计原则-接口隔离原则讲解以及代码示例

接口隔离原则 一,介绍 1.前言 接口隔离原则(Interface Segregation Principle,ISP)是面向对象设计中的一个原则,提倡使用多个专门的接口,而不使用单一的大接口。它最早由Robert C. Martin在其《敏捷软件…...

yolov8x-p2 实现 tensorrt 推理

简述 在最开始的yolov8提供的不同size的版本,包括n、s、m、l、x(模型规模依次增大,通过depth, width, max_channels控制大小),这些都是通过P3、P4和P5提取图片特征; 正常的yolov8对象检测模型输出层是P3、…...

Type Script的变量类型

Typescript 的重要特性之一就是数据有类型了。 常见的类型如:字符串、数值、布尔等都有了明确的定义。 变量声明的格式 let 变量名:类型 初始值;字符型 let str:string "abc";数值型 数值型也支持不同的进制,用前缀区分 支持 整…...

系统架构师备考倒计时13天(每日知识点)

1. 数据仓库四大特点 面向主题的。操作型数据库的数据组织面向事务处理任务,各个业务系统之间各自分离,而数据仓库中的数据是按照一定的主题域进行组织的。集成的。数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整…...

20 | Spring Data JPA 中文文档

Spring Data JPA 中文文档 1. 前言 Spring Data JPA 为 Jakarta Persistence API(JPA)提供 repository 支持。它简化了需要访问JPA数据源的应用程序的开发。 1.1. 项目元数据 版本控制: https://github.com/spring-projects/spring-data-jpaBug跟踪:…...

【AOA-VMD-LSTM分类故障诊断】基于阿基米德算法AOA优化变分模态分解VMD的长短期记忆网络LSTM分类算法(Matlab代码)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

K8s:Pod 中 command、args 与 Dockerfile 中 CMD、 ENTRYPOINT 的对应关系

写在前面 前几天被问到,这里整理笔记之前也没怎么注意这个问题理解不足小伙伴帮忙指正 曾以为老去是很遥远的事,突然发现年轻是很久以前的事了。时光好不经用,抬眼已是半生,所谓的中年危机,真正让人焦虑的不是孤单、不…...

Visual Studio Code (VS Code)安装教程

Visual Studio Code(简称“VS Code”)。 1.下载安装包 VS Code的官网: Visual Studio Code - Code Editing. Redefined 首先提及一下,vscode是不需要破解操作的; 第一步,看好版本,由于我的系…...

技巧 | 如何解决 zsh: permission denied 问题 | Mac

技巧 | 如何解决 zsh: permission denied 问题 | Mac 问题描述 在 macOS 系统终端执行 sh 程序脚本时,抛出异常 zsh: permission denied 原因分析 用户没有权限,所以才出现了这个错误,所以只需要用 chmod 修改一下权限就可以了 解决方法…...

【JavaEE】线程安全的集合类 -- 多线程篇(9)

线程安全的集合类 多线程环境使用 ArrayList多线程环境使用队列多线程环境使用哈希表 多线程环境使用 ArrayList 自己使用同步机制 (synchronized 或者 ReentrantLock)Collections.synchronizedList(new ArrayList); synchronizedList 是标准库提供的一个基于 synchronized 进…...

【MySQL架构篇】MySQL字符集、大小写规范及默认数据库

文章目录 1. 字符集与字符集比较规则2. 大小写规范3. 默认数据库4. 与文件系统相关 1. 字符集与字符集比较规则 MySQL有4个级别的字符集和比较规则,分别是 服务器级别数据库级别表级别列级别 当创建对应表或列未指定字符集时,默认会取其上一级别的字符…...

【Linux系统编程】命令模式2

目录 一,Linux下的初阶认识 1,管道 2,时间戳 二,Liunx系统命令操作 1,date时间指令 2,cal日历指令 3,which和find查找指令 3-1,which指令: 3-2,find…...

【Leetcode】【中等】1726.同积元组

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/tuple-with-same-product/ 给你…...

Git教程

文章目录 Git 介绍GIt历史Git 安装环境配置工作区、缓存区和仓库区(版本库)工作区(工作目录)暂存区仓库区git工作目录下文件的装填 Git 生成公钥及添加到gitlab或Gerrit上Git常用命令git stautsgit statu -sgit addgit commitgit reset1. git reset --ha…...

使用序列化技术保存数据 改进 IO流完成项目实战水果库存系统

上一节内容是 使用IO流完成项目实战水果库存系统https://blog.csdn.net/m0_65152767/article/details/133999972?spm1001.2014.3001.5501 package com.csdn.fruit.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java…...

0基础学习PyFlink——使用PyFlink的Sink将结果输出到外部系统

在《0基础学习PyFlink——使用PyFlink的SQL进行字数统计》一文中,我们直接执行了Select查询操作,在终端中直接看到了查询结果。 select word, count(1) as count from source group by word; ------------------------------------------------------ |…...

会声会影2024旗舰版详细功能介绍

随着网络视频的蓬勃发展,越来越多的人开始涉足视频剪辑领域,毕竟技多不压身嘛。在众多剪辑软件中,剪映和会声会影是备受新手青睐的两种。那么,会声会影和剪映哪个好呢?在它们之间,哪一个更适合初学者呢接&a…...

QtCreator 查看类帮助文档,快捷键操作:按两次F1 全屏帮助,Esc取消全屏

如何查看类帮助文档 选择类&#xff0c;按F1查看类帮助文档。 示例&#xff1a; #include <QLabel> // 将光标放在QLabel上&#xff0c;按F1右侧弹出的类帮助手册可视宽度很小&#xff0c;如果按两次 F1 键&#xff0c;帮助文档将会以全屏模式显示&#xff0c;以便更清…...

C语言文件操作(1)

C语言文件操作&#xff08;1&#xff09; 文章目录 C语言文件操作&#xff08;1&#xff09;一、理解文件1.概述2.分类①.正常角度②.文本文件和二进制文件 二、文件的打开和关闭1.流和标准流2.文件类型指针3.文件的打开和关闭以及使用类型 三、文件缓冲区 一、理解文件 1.概述…...

adb 操作命令(adb调试QT项目使用到的命令)

1.adb连接串口 获取root权限 adb root && adb remount && adb shell2.测试串口命令 stty -F /dev/ttyS4 cs8 -parenb -cstopb -echoecho "12345\n" > /dev/ttyS8cat /dev/ttyS4 &3.软件在安卓系统上的名字已经活动名称&#xff08;下面是示…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...