设计原则之【接口隔离原则】,我只做我能做的事

news2024/10/7 7:33:25

文章目录

  • 一、什么是接口隔离原则
  • 二、实例
  • 三、总结
    • 接口隔离原则与单一职责原则的区别

一、什么是接口隔离原则

接口隔离原则(Interface Segregation Principle, ISP)是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。这个原则指导我们在设计接口时应当注意一下几点:
1、一个类对一类的依赖应该建立在最小的接口之上。
2、建立单一接口,不要建立庞大臃肿的接口。
3、尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)。

二、实例

接口隔离原则符合我们常说的高内聚低耦合的设计思想,从而使得类具有很好的可读性、可扩展性和可维护性。我们在设计接口的时候,要多花时间去思考,要考虑业务模型,包括以后有可能发生变更的地方还要做一些预判。所以,对于抽象,对业务模型的理解是非常重要的。下面我们来看一段代码,写一个动物行为的抽象:

// IAnimal 接口
public interface IAnimal {
	void eat();
	void fly();
	void swim();
}
// Bird实现
public class Bird implements IAnimal {
	@Override
	public void eat() {}
	@Override
	public void fly() {}
	@Override
	public void swim() {}
}
// Dog实现
public class Dog implements IAnimal {
	@Override
	public void eat() {}
	@Override
	public void fly() {}
	@Override
	public void swim() {}
}

可以看出,Bird 的 swim()方法可能只能空着,Dog 的 fly()方法显然不可能的。这时候,我们针对不同动物行为来设计不同的接口,分别设计 IEatAnimal,IFlyAnimal 和 ISwimAnimal 接口,来看代码:

public interface IEatAnimal {
	void eat();
}

public interface IFlyAnimal {
	void fly();
}

public interface ISwimAnimal {
	void swim();
}

Dog只能eat和swim:

public class Dog implements ISwimAnimal,IEatAnimal {
	@Override
	public void eat() {}
	@Override
	public void swim() {}
}

我们对比一下类图:
在这里插入图片描述

三、总结

理解“接口隔离原则”的重点是理解其中的“接口”二字。这里有三种不同的理解。

如果把“接口”理解为一组接口集合,可以是某个微服务的接口,也可以是某个类库的接口等。如果部分接口只被部分调用者使用,我们就需要将这部分接口隔离出来,单独给这部分调用者使用,而不强迫其他调用者也依赖这部分不会被用到的接口。

如果把“接口”理解为单个 API 接口或函数,部分调用者只需要函数中的部分功能,那我们就需要把函数拆分成粒度更细的多个函数,让调用者只依赖它需要的那个细粒度函数。

如果把“接口”理解为 OOP 中的接口,也可以理解为面向对象编程语言中的接口语法。那接口的设计要尽量单一,不要让接口的实现类和调用者,依赖不需要的接口函数。

接口隔离原则与单一职责原则的区别

单一职责原则针对的是模块、类、接口的设计。接口隔离原则相对于单一职责原则,一方面更侧重于接口的设计,另一方面它的思考角度也是不同的。接口隔离原则提供了一种判断接口的职责是否单一的标准:通过调用者如何使用接口来间接地判定。如果调用者只使用部分接口或接口的部分功能,那接口的设计就不够职责单一。

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

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

相关文章

OpenDDS安装环境构建+Demo实践(自己动手写一个)

此文用于辅助构建类似于OpenDDS\DevGuideExamples\DCPS\Messenger的Demo示例 OpenDDS安装环境构建Demo实践(自己动手写一个) 本文相关参考资料OpenDDS安装环境构建参考博客 Demo上手实践(依赖于Windows下的OpenDDS环境)OpenDDS安…

Android中常见的内存优化及内存泄露场景

避免内存泄露的关键是及时释放不再需要的资源,特别是生命周期较长的资源。在Activity和Fragment的生命周期方法中释放这些资源,如onDestroy()方法中释放线程、集合等引用,避免这些资源的生命周期过长导致内存泄露。 Android内存优化主要有以下几个方面: 合理设置应用的minSdk…

身为企业管理者,必须了解的财务知识

财务管理工作是企业管理工作中的核心内容,也是企业管理工作中的难点内容,对于集团企业来讲更是任务艰巨而又问题频出。然而,信息时代的来临为解决和完善企业财务管理问题提供了新思路,就集团企业而言,财务管理信息化基…

如何解决人力资本管理挑战?

人力资本管理(HCM)是任何企业成功的一个重要因素。得益于高效、多产和敬业的员工队伍,在此领域找到正确的方法和策略可以推动您取得更大的成果。 但是,除了关注HCM的好处和机会之外,你还需要做好准备,以克…

PCB多层板 : 磁通对消法有效控制EMC

在PCB的EMC设计考虑中,首先涉及的便是层的设置;单板的层数由电源、地的层数和信号层数组成;在产品的EMC设计中,除了元器件的选择和电路设计之外,良好的PCB设计也是一个非常重要的因素。 PCB的EMC设计的关键&#xff0…

初阶数据结构——链表习题

目录 如何快速调试链表习题链表习题移除链表元素链表的中间节点反转链表链表中倒数第k个结点合并两个有序链表链表分割链表的回文结构相交链表环形链表slow和fast一定会相遇吗?如果fast一次走(3、4、5)步呢? 环形链表 Ⅱ思路1:推论思路2&…

数字化时代,探寻BI本质与发展趋势

可能和很多人想象的不同,商业智能BI虽然是信息化、数字化领域内的重要的数据类技术解决方案,但是商业智能BI并不是在当前时代突然冒出来的新应用,而是经过数十年积累的成熟产品。 早在1958年,IBM研究员就将商业智能BI的早期形态定…

计算卸载-论文02-计算资源差分定价

标题:《Differential Pricing-based Task Offloading for Delay-Sensitive IoT Applications in Mobile Edge Computing System》 期刊: IEEE Internet of Things Journal,2022 一、梳理 问题:在计算卸载许多场景中&#xff0c…

低代码平台:10分钟从入门到原理

导航目录 一、低代码概念 二、优势及局限 三、基础功能及搭建 1、业务流程 2、用户权限 3、统计图表 四、使用感受 五、总结 传统的软件研发方式目前并不能很好地满足企业的需求:人员成本高、研发时间长、运维复杂。这时低代码工具的出现为快速开发软件提供…

智慧校园平台源码 智慧班牌源码 人脸识别技术 电子班牌源码 家校互联小程序源码

智慧校园平台源码 智慧班牌源码 人脸识别技术 电子班牌源码 家校互联小程序源码 源码开发环境:Javaspringbootvueelement-uimysql 智慧校园系统定位于中小学教育学校,侧重实际应用,讲究实际,突出加强校园安全监管,德…

冗余-安全设计的基石

冗余构成原理就是在系统中采用2套中央处理器(CPU)单元,其中1套为工作主机,1套为热备,一旦工作主机发生故障,热备的CPU将自动投入工作,此时热备的CPU变为工作主机,原工作主机故障处理…

五月份了,让我看看有多少金三银四没找到工作的.....

前两天跟朋友感慨,去年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在都已经5月了,金三银四都结束一段时间了。 金三银四都已经结束,大部分企业也招到了自己需要的人,但是我看我的读者们还是有很大一部分人在抱…

GEE:设置下载数据的Nodata值,并在ArcGIS中将空值设置为空

作者:CSDN @ _养乐多_ Google Earth Engine(GEE)是一个功能强大的云平台,用于进行地理空间数据处理和分析。它提供了丰富的数据集和工具,使得在研究和应用中使用遥感数据变得更加便捷。本文将介绍如何使用GEE设置下载的数据的Nodata值,并在ArcGIS软件中将空值设置为空,…

Golang笔记:使用标准库中os.Args和flag包编写命令行界面(CLIs)

文章目录 目的os.ArgsflagFlagSet总结 目的 命令行界面(Command-line Interfaces)是比较常用的一种软件形式。对于大部分开发运维人员来说很多时候CLIs可能比图形界面更加方便。软件开发时也经常会有需要开发命令行界面形式软件的情况,使用G…

栈和队列:理解与使用

目录 栈 顺序栈结构 链式栈结构 中缀表达式和后缀表达式 顺序栈四则运算 链式栈四则运算 队列 顺序队列结构 链式队列结构 总结 栈和队列是计算机科学中常见的数据结构,它们都是一种线性数据结构,可以对元素进行快速的插入、删除和查找操作。栈…

00后工资太低,现在转行数据分析还能就业吗?,求大佬指点!

当然可以就业,只要专业技能过关。IT是靠技术吃饭的行业,没有复杂的人际关系和面子工程,相对其他行业要纯粹一些。当然,如果你技术不过关,或者跟不上技术更新发展速度,淘汰也是必然的,IT行业不能…

听我一句劝,千万别去外包,两年外包生涯做完,感觉自己废了一半....

先说一下自己的情况。大专生,18年通过校招进入湖南某软件公司,干了接近5年的点点点,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了五年的功能测试…

前端开发和测试的新伙伴:Requestly,让你事半功倍!

目录 引言 痛点 前端测试 后端测试 曾使用的应对措施 Charles Chrome 插件 实现mock工具 Requestly Requestly的功能 流量捕捉方式 请求的修改 响应的修改 请求响应录制 我对Requestly的应用 总结 引言 想必每个前端开发和测试的小伙伴都曾经历过不断地切换页…

CV界的chatgpt出现——Segment Anything能分割万物

目录 一、前言(1)弱人工智能(Weak AI)(2)强人工智能(General AI)(3)超人工智能(Super AI) 二、SAM的一些介绍2.1 模型的结构是什么&am…

React动态路由配置

目录 项目初始化 模块创建 统一导出 全局模块配置选项 核心代码 使用及效果展示 博文适用于react-router v6及以上,其中还有很多值得改进的地方 最近学习react的过程中,思考怎样实现动态路由的配置(最终实现从页面配置最终动态从数据库加载上线模…