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

一言

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

为什么要有接口隔离原则

反例设计

在这里插入图片描述

反例代码

public class Segregation1 {
}interface Interface1 {void operation1();void operation2();void operation3();void operation4();void operation5();
}class B implements Interface1{@Overridepublic void operation1() {System.out.println("B实现了 operation1");}@Overridepublic void operation2() {System.out.println("B实现了 operation2");}@Overridepublic void operation3() {System.out.println("B实现了 operation3");}@Overridepublic void operation4() {System.out.println("B实现了 operation4");}@Overridepublic void operation5() {System.out.println("B实现了 operation5");}
}class D implements Interface1{@Overridepublic void operation1() {System.out.println("D实现了 operation1");}@Overridepublic void operation2() {System.out.println("D实现了 operation2");}@Overridepublic void operation3() {System.out.println("D实现了 operation3");}@Overridepublic void operation4() {System.out.println("D实现了 operation4");}@Overridepublic 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{@Overridepublic void operation1() {System.out.println("B实现了 operation1");}@Overridepublic void operation2() {System.out.println("B实现了 operation2");}@Overridepublic void operation3() {System.out.println("B实现了 operation3");}
}class D implements Interface1,Interface3{@Overridepublic void operation1() {System.out.println("D实现了 operation1");}@Overridepublic void operation4() {System.out.println("D实现了 operation4");}@Overridepublic 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

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

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

相关文章

VBA之Word应用:文档(Document)的书签

《VBA之Word应用》(版权10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实…

Java入门篇 之 抽象类接口

本篇碎碎念:个人认为压力是一种前进的动力,但是不要有太多压力,不然会使心情烦躁,会控制不住自己的情绪,会在一个临界值爆发,一旦爆发,将迟迟不能消散 今日份励志文案: 努力的背后必有加倍的赏赐…

【算法每日一练]-分块(保姆级教程 篇1)POJ3648

插讲一下分块 题目:(POJ 3648) 一个简单的整数问题 前缀和往往用于静态的不会修改的区间和。遇到经常修改的区间问题,就要用分块或线段树来维护了。 分块算法是优化后的暴力,分块算法有时可以维护一些线段树维护不了的…

mysql的行列互转

mysql的行列互转 多行转多列思路实现代码 多列转多行思路代码 多行转多列 多行转多列,就是数据库中存在的多条具有一定相同值的行数据,通过提取相同值在列头展示来实现行数据转为列数据,一般提取的值为枚举值。 思路 转换前表样式 -> 转…

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例

上链接: P5250 【深基17.例5】木材仓库 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P5250上题干: 题目描述 博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是…

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

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

LeetCode【13】罗马数字转整数

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

分享禁止Win10更新的两种方法

深恶痛绝 Windows更新简直就是毒瘤,总是在某些不需要的时候提示更新,而且关闭服务后总有办法重启。老是关不掉。 如果每次都是正常更新,好像也没啥所谓,但是总有那么一两次会蓝屏、黑屏、开不了机…… 52出品 下面是吾爱社区找…

算法之冒泡排序

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

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

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

使用Docker/K8S部署项目流程

一、制作镜像: 1、创建nginx配置文件default.conf server {listen 80;server_name localhost; # 修改为docker服务宿主机的iplocation / {root /usr/share/nginx/html;index index.html index.htm;try_files $uri $uri/ /index.html 404;}error_page …

百胜杯答题系统

近期太忙了 百胜方答题活动于近期终于告一段落,这个活动周期长,参与人数多,是我这几年做答题活动的一个巅峰之作 当然项目开发难度不大,主要是参与人数突破了百万,对我而言是一次很好的历练 具体的设计方案 百胜杯答…