软件设计原则之接口隔离原则

接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计中的一个重要原则,它属于SOLID原则之一。这个原则强调客户端(即接口的调用者)不应该被迫依赖于它们不使用的方法。换句话说,一个类对另一个类的依赖应该建立在最小的接口上。接口隔离原则的主要目的是使系统更加模块化,易于维护和扩展。

目录

  • 接口隔离原则的核心思想
  • 接口隔离原则的优点
  • 应用场景
  • 接口隔离的比方
  • 应用开发实例
  • 缺点

接口隔离原则的核心思想

高内聚低耦合: 接口的设计应尽量做到高内聚,即接口中的方法都围绕一个共同的目标;同时接口间的耦合度要低,每个接口只承担单一的职责。
小接口优于大接口: 如果一个大接口中的部分方法被部分调用者使用,而另一部分方法被其他调用者使用,那么这个大接口就应该被拆分成几个小接口,让调用者只依赖它们需要的接口。
客户端不应依赖它不使用的方法: 一个接口如果有一些方法是不被某类使用的,那么这个接口对于这些类来说就是过于庞大,需要拆分成更小的接口。

接口隔离原则的优点

降低系统间的耦合度: 通过拆分接口,使得各个类之间的依赖关系更加明确,减少了不必要的依赖,从而降低了系统间的耦合度。
提高系统的灵活性:由于接口变小、职责单一,使得接口易于被替换和修改,提高了系统的灵活性。
增强系统的可维护性: 由于每个接口都相对较小,易于理解和维护,同时当接口需要修改时,影响的范围也较小。

应用场景

当一个接口中的方法被不同的类以不同的方式使用时: 这些方法应该被拆分到不同的接口中。
当系统的扩展性要求较高时: 通过遵循接口隔离原则,可以更容易地添加新的接口和实现类,而不需要修改现有的接口和实现类。
当系统的维护性要求较高时: 接口隔离原则使得接口更加清晰、简单,易于理解和维护。

接口隔离的比方

就违反 ISP 规定而言,下面的图片显示了一个大垃圾箱,用来扔掉各种垃圾,没有任何隔离措施。
在这里插入图片描述

使用 ISP,下面的图像是我们现实生活中隔离的一个很好的例子。在这里插入图片描述

应用开发实例

下面是一个银行客户的例子,银行客户的类型如下:
企业客户: 为企业员工服务。
零售客户: 个人,日常银行业务。
潜在客户: 他们只是一个银行客户,还没有持有银行的产品,这只是一个记录,不同于公司和零售。
未遵守ISP
乍看起来还可以,但是对于有问题的客户来说,这是一个很大的接口,因为它强制客户端类实现不需要的方法。
如果所描述的潜在客户不持有任何产品,则必须实现产品属性。
一个潜在客户和一个零售客户都被迫拥有一个客户结构属性,但是在真实的场景中,一个公司客户拥有一个描述客户层次结构的客户结构。
潜在客户和零售客户都必须实现 BusinessType,但它只属于公司客户。
一个公司客户和一个潜在客户被迫实现一个“Occupation”属性,这个属性对于潜在客户来说不存在。
前面问题的一个解决方案是将胖接口分割成有意义的部分,换句话说,小接口,因此客户类型只实现它所需要的接口。

在这里插入图片描述

缺点

1、接口大爆炸: 如果接口拆分的非常细,可能会导致接口数量急剧增加,形成所谓的“接口大爆炸”。这会增加系统的复杂性和管理难度,因为开发者需要维护更多的接口文档和代码。
2、性能开销: 在某些情况下,细化的接口可能会导致性能下降。因为每次调用接口时都需要进行额外的类型检查和转换操作,这会增加系统的运行开销。特别是在高频调用的场景下,这种开销可能会更加明显。
3、开发成本增加: 随着接口数量的增加,开发成本也会相应增加。开发者需要为每个接口编写和维护代码,这增加了开发和维护的工作量。同时,过多的接口也可能导致团队成员之间的沟通成本上升。
4、理解和使用难度: 对于新加入项目的开发者来说,面对大量的细粒度接口可能会感到困惑和难以理解。他们需要花费更多的时间和精力来熟悉和掌握这些接口的使用方法和规则

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SOA通信中间件介绍(一)

一、通信中间件 在软件定义汽车中,应用程序之间的跨进程或跨核通信是一个需要解决的问题。模块化架构为开发人员提供了便利,但也引入了对通信中间件的需求。 在没有使用通信中间件的情况下,开发人员需要自己定义数据的格式、发送方和接收方…

趣味呈现高效农业管理:智慧农场可视化

运用图扑自主研发的 HT 产品,全程零代码搭建 3D 轻量化 Low Poly 风格的智慧农场可视化,通过生动有趣的图形展示农场运作细节,使农业管理更直观易懂,提升管理效率和用户体验。

C++ 基础学习

提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream>using namespace std;int main() {cout<<"请输入字符串:";string str;getline(cin,str);int num0;int alp0;int spa0;int other0;int …

网络安全面试经验分享:蘑菇街/网络安全

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 蘑菇街 介绍…

【STM32】MDK安装

1 MDK 历史背景 Keil公司是一家业界领先的微控制器&#xff08;MCU&#xff09;软件开发工具的独立供应商。Keil公司由两家私人公司联合运营&#xff0c;分别是德国慕尼黑的Keil Elektronik GmbH和美国德克萨斯的Keil Software Inc。Keil公司制造和销售种类广泛的开发工具&am…

自动化脚本到LabVIEW转换

工业自动化领域中的专用脚本语言转换为LabVIEW时需要注意的问题 语法差异&#xff1a; 脚本语言特点&#xff1a; 工业自动化脚本语言通常具有特定的语法和结构&#xff0c;例如条件判断、循环控制、硬件指令等。这些语言直接面向硬件操作&#xff0c;语法简洁&#xff0c;适用…

element-plus 新增一行合计。除了用summary-method还可以用append的插槽

:summary-method"getSummaries" <el-table:data"reformtableData"style"width: 100%"show-summary:summary-method"getSummaries"ref"reformtableRef" > <el-table-column label"序号" type"index…

MyBatis查询 ▎修改 ▎删除

前言: 在现代应用开发中&#xff0c;数据库操作是核心环节。MyBatis 作为一款灵活的持久层框架&#xff0c;提供了直接编写 SQL 语句的能力&#xff0c;避免了其他 ORM 框架可能带来的性能和功能限制。MyBatis 的查询、修改和删除操作是开发者必须掌握的基本技能。这些操作不仅…

go 使用 gitlab 搭建私有化模块系统

背景 本教程旨在教大家使用私有化部署的 gitlab 作为 go 的代码共享库&#xff0c;帮助团队分离代码模块&#xff0c;加强质量管控。go 官方在实现过程中就高度结合 VCS 系统&#xff0c; 可以仅通过配置相关的环境变量就实现私有库在 VCS 上的搭建。 代码分离样例 这里直接…

虚幻5|制作玩家血量,体力(还未编辑,只用于引用)

未编写&#xff0c;仅引用 优化后&#xff1a; 把增加生命&#xff0c;减少生命&#xff0c;也可以用在体力里&#xff0c;更改如下 限制浮点&#xff0c;如果血量或体力按10来扣&#xff0c;如果你的血量降低到5&#xff0c;那么就会以5的数值来扣&#xff0c;而不会扣成-5…

JVM极简教程

基础概念 1.1. Java 虚拟机 是运行 Java字节码的虚拟机 1.2. JVM跨平台原理 JVM在不同的系统&#xff08;Linux、Windows、MacOS&#xff09;上有不同的实现&#xff0c;目的是在使用相同的字节码&#xff0c;它们都会给出相同的结果 JVM跨平台本质&#xff1a;不同操作系统…

如何满足业主多元需求?开发物业APP,打造智能社区生活

随着智能科技的快速发展&#xff0c;物业管理也逐渐迈入数字化时代。物业app开发成为了提升社区管理效率、改善居民生活质量的重要途径&#xff0c;许多物业管理公司纷纷开发物业App&#xff0c;以提升管理效率、改善用户体验。一款出色的物业APP能够整合居民需求、提升企业服务…

Mybatis进阶——动态SQL

动态SQL 是Mybatis的强大特性之一&#xff0c;能够完成不同条件下的不同SQL拼接&#xff0c;可以参考官方文档&#xff1a;动态 SQL_MyBatis中文网 xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLI…

uniapp/uniapp x总结

uni-app组成和跨端原理 上图所诉 App的渲染引擎&#xff1a;同时提供了2套渲染引擎&#xff0c;.vue页面文件由webview渲染&#xff0c;原理与小程序相同&#xff1b;.nvue页面文件由原生渲染&#xff0c;原理与react native相同。开发者可以根据需要自主选择渲染引擎。 uniapp…

52.给定一个整数 n,实现一个算法返回 n 皇后不同的解决方案的数量

52. N-Queens II 题目 n皇后问题是指将n个皇后放置在一个nn的棋盘上,使得任意两个皇后不在同一行、同一列或同一对角线上。 给定一个整数 n,返回 n 皇后问题不同的解法数量。 示例: 输入: 4 输出: 2 解释: 4皇后问题有如下两个不同的解法: [ [“.Q…”, // 解法 1 “……

sqli-labs靶场通关攻略(36-40关)

第36关&#xff08;宽字节注入&#xff08;Bypass MySQL Real Escape String&#xff09;&#xff09; 查数据库 ?id-1%df%27%20union%20select%202,database(),3%20-- 查表 ?id-1%df union select 1,group_concat(table_name),3 from information_schema.tables where tab…

Python青少年简明教程:列表(List)、元组(tuple)和字典(dict)

Python青少年简明教程&#xff1a;列表&#xff08;List&#xff09;、元组&#xff08;tuple&#xff09;和字典&#xff08;dict&#xff09; 在Python中&#xff0c;列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;和字典&#xff08;Dict&#xff09…

Ubuntu下部署Hadoop集群+Hive(三)

Hive部署 准备环境 apache-hive-4.0.0-bin.tar.gz、mysql-connector-j-8.1.0.jar 如果是离线安装的话&#xff0c;使用mysql-8.0.34-1.el7.x86_64.rpm-bundle.tar&#xff0c;在线安装的话则不用&#xff1b; hive下载地址&#xff1a;Index of /hive (apache.org) mysql …

机械学习—零基础学习日志(如何理解概率论9)

大数定律与中心定律 来看一道习题&#xff1a; 这个题目看看&#xff0c;应该是什么呢~下一章来看看解析~ 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08;王志超&#xff09;》学习笔记 王志超老师 &#xff08;UP主&#xff09;

vue3 + ElImage + nodejs 集成了看板娘(UI原生开发达99%)的响应式BLOG(个人博客)。

一、想要我的屎山代码&#xff0c;可以私聊我哟 访问地址&#xff0c;欢迎访问&#xff08;访问效果更佳&#xff09; ☂ 被你发现了&#xff01;&#xff5c; snows_ls BLOGhttp://124.223.41.220/ 欢迎互挂友链 二、做了个啥 1、看板娘&#xff08;看效果好吧&#xff09;…