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

news2024/12/23 17:38:18

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

目录

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

接口隔离原则的核心思想

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

接口隔离原则的优点

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

应用场景

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

接口隔离的比方

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

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

应用开发实例

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

在这里插入图片描述

缺点

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【区块链 + 司法存证】数据存证区块链服务开放平台 | FISCO BCOS应用案例

大数据时代,数据参与社会生产过程,实现价值增值,是一种新型生产要素。数据产品具有易复制、易修改等特点, 因而数据产品在使用、流通过程中面临被非法复制、非法传播、非法篡改和知识产权窃取等安全风险。在存证数 据上链过程中&a…

PDF转化为机器可读格式的工具

MinerU PDF转化为机器可读格式的工具 项目简介 MinerU是一款将PDF转化为机器可读格式的工具(如markdown、json),可以很方便地抽取为任意格式。 项目地址: https://github.com/opendatalab/MinerU/tree/master主要功能 删除页…

微信开发者工具 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开文件设置对话框2. 在Font Family里面输入字体 前言 微信开发者工具 自定义字体大小,统一设置为 Cascadia Code SemiBold ,大小为 14 具体操作 【文件】>【首选项】>【设置】>【文…

登录校验组件 Spring Security OAuth2 详解

什么是OAuth? OAuth(全称Open Authorization,开放授权)是一种基于令牌的身份验证和授权协议,它允许用户授权第三方应用访问其在服务提供者(如社交媒体、邮箱服务等)上存储的特定信息,而无需直…

安防监控/软硬一体/视频汇聚网关EasyCVR硬件启动崩溃是什么原因?

安防视频监控EasyCVR安防监控视频系统采用先进的网络传输技术,支持高清视频的接入和传输,能够满足大规模、高并发的远程监控需求。EasyCVR平台支持多种视频流的外部分发,如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、WS-FMP4、HTTP-…

PyTorch深度学习网络(二:CNN)

卷积神经网络(CNN)是一种专门用于处理具有类似网格结构数据的深度学习模型,例如图像(2D网格的像素)和时间序列数据(1D网格的信号强度)。CNN在图像识别、图像分类、物体检测、语音识别等领域有着…

API网关之Kong

Kong 是一个高性能的开源 API 网关和微服务管理平台,用于管理、保护和扩展 API 和微服务。它最初由 Mashape 公司开发,并于 2015 年作为开源项目发布。Kong 能够处理 API 的路由、认证、负载均衡、缓存、监控、限流等多种功能,是微服务架构中…

Mysql中count(*) over 用法讲解

Mysql中count(*) over ()用法讲解 一、原理1、原理介绍 二、下面是一个使用COUNT(*) OVER()的代码示例:1、代码示例2、结果详解3、COUNT(*) OVER() 分区用法 三 、总结 一、原理 1、原理介绍 在MySQL中,C…

MySQL集群的基础部署及主从复制详解

一、Msql在服务器中的部署方法 官网:http://www.mysql.com 在企业中90%的服务器操作系统均为Linux 在企业中对于Mysql的安装通常用源码编译的方式来进行 1.1 在Linux下部署MySQL 1.1.1 部署环境 主机IP角色MySQL-node1172.25.254.13masterMySQL-node2172.25.…

【C语言】深入理解指针(四)qsort函数的实现

指针4 1.回调函数是什么2.qsort使用举例3.qsort函数的模拟实现 1.回调函数是什么 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的…

【CanMV K230】外接传感器

【CanMV K230】外接传感器 外接LED灯 B站视频链接 抖音链接 我们后面主要做是机器视觉。K230能帮我们捕捉到图像信息。更多小功能需要我们自己来做。 比如舵机抬杆,测温报警等 都需要我们外接传感器。 本篇就来分享一下如何使用K230外接传感器 首先需要知道K230…

Leetcode JAVA刷刷站(98)验证二叉搜索树

一、题目概述 二、思路方向 在Java中,要判断一个二叉树是否是有效的二叉搜索树(BST),我们可以采用递归的方法,通过维护一个外部的范围(通常是Integer.MIN_VALUE到Integer.MAX_VALUE作为初始范围&#xff…

网络优化4|网络流问题|路径规划问题|车辆路径问题

网络流问题 网络最大流问题 研究网络通过的流量也是生产管理中经常遇到的问题 例如:交通干线车辆最大通行能力、生产流水线产品最大加工能力、供水网络中最大水流量等。这类网络的弧有确定的容量,虽然常用 c i j c_{ij} cij​表示从节点 i i i到节点 j…

怎么检测电脑的RAM?丨什么是RAM?

RAM 是 Random Access Memory 的缩写,它是一个允许计算机短期存储数据以更快访问的组件。众所周知,操作系统、应用程序和各种个人文件都存储在硬盘驱动器中。 当 CPU 需要调用硬盘上的数据进行计算和运行时,CPU 会将数据传输到 RAM 中进行计…

安防视频汇聚平台EasyCVR启动后无法访问登录页面是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等…

科研绘图系列:R语言多组极坐标图(grouped polar plot)

介绍 Polar plot(极坐标图)是一种二维图表,它使用极坐标系统来表示数据,而不是像笛卡尔坐标系(直角坐标系)那样使用x和y坐标。在极坐标图中,每个数据点由一个角度(极角)和一个半径(极径)来确定。角度通常从水平线(或图表的某个固定参考方向)开始测量,而半径则是…

Jenkins发邮件功能如何配置以实现自动化?

jenkins发邮件的设置指南?Jenkins怎么配置服务器? Jenkins作为一个流行的自动化服务器,其发邮件功能是通知团队成员构建状态的重要手段。AokSend将详细介绍如何配置Jenkins发邮件功能,以实现自动化通知。 Jenkins发邮件&#xf…

NVI技术创新联盟成立,BOSMA博冠IP轻量化制播已运用

2024年北京国际广播电影电视展览会(BIRTV)首日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV 2024超高清全产业链发展研讨会上宣布正式成立。作为国产8K摄像机先行者,BOSMA博冠受邀加入NVI技术…

Flowable BPMN bpmnjs 设计器

最近半年我一直在打造一款行业顶尖的流程设计器,适配了flowable所有的组件,美观,大方,灵活,好用。所有的组件都进行严格的测试并在生产环境上线了。 1、在线预览 2、整体框架布局 3、组件分组 4、完整模式切换 给大…

若依,前后端分离项目,部署到服务器

1.后端项目用maven打包 正式服的话,测试不用加。 application.yml加上context-path: /prod-api 一定要选择root的ruoyi,他会把你自动打包其他模块的依赖 全部成功。然后去ruoyi-admin拿到这个包,java -jar ruoyi-admin.jar就可以了 将jar上…