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

贯穿设计模式第五话--接口隔离原则

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳

从今天开始,将开启一个专栏,【贯穿设计模式】,设计模式是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。为了能更好的设计出优雅的代码,为了能更好的提升自己的编程水准,为了能够更好的理解诸多技术的底层源码, 设计模式就是基石,万丈高楼平地起,一砖一瓦皆根基。 ✨✨欢迎订阅本专栏✨✨

🥺 本人不才,如果文章知识点有缺漏、错误的地方 🧐,也欢迎各位人才们评论批评指正!和大家一起学习,一起进步! 👀

❤️ 愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海! ❤️

💬 最后,希望我的这篇文章能对你的有所帮助! 🍊 点赞 👍 收藏 ⭐留言 📝 都是我最大的动力!

📃 前言回顾


​ 🔥【贯穿设计模式】第一话·设计模式初介绍和单一职责原则🔥

​ 🔥【贯穿设计模式】第二话·设计模式的七大原则之开闭原则🔥

​ 🔥【贯穿设计模式】第三话·设计模式的七大原则之依赖倒转🔥

​ 🔥【贯穿设计模式】第四话·设计模式的七大原则之里氏替换🔥

在第四篇文章中,我们了解设计模式的七大原则中第四个原则: 里氏替换原则;

我们来回顾下,它的定义:任何基类可以出现的地方,子类一定可以出现,即所有引用基类的地方都必须能够透明的使用其子类;里氏替换原则是继承与复用的基石,只有当子类可以替换掉基类,且系统的功能不受影响时,基类才能被复用,而子类也能够在基础类上增加新的行为;所以里氏替换原则指的是任何基类可以出现的地方,子类一定可以出现

并且我们通过动物鸟类中,不同鸟类有会飞的和不会飞的,如果都定义一个飞翔代码,在继承的过程就会导致重写父类的方法导致违反了里氏替换原则了,

值得注意的是:在实现里氏替换原则过程中,常常可以通过依赖、聚合,组合等关系代替c

🦀接口隔离原则

今天我们学习的是接口隔离原则,一个类不应该依赖它不需要的接口。

🦞概述

  • 该原则是指一个类不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最少接口上;
  • 根据接口隔离原则拆分接口时,首先必须满足单一职责原则,而使用接口隔离,也能提高系统的高内聚;
  • 简单理解就是使用多个隔离的接口,比使用单个接口要好,即要为各个类建立它们需要的专用接口,不要为了省事而试图去建立一个很庞大的接口供所有依赖它的类去调用,并且这是一个能降低类之间的耦合度;
  • 比如有一个接口A,它其中有5个方法,现在类B需要用到接口A的三个方法,所以B类直接实现了接口A的全部方法,这就导致了B类多了两个不需要的方法,接口A对于类B来说并不是最小接口了,此时应该将臃肿的接口A拆分为独立的几个接口,类B与需要的接口建立依赖关系即可,也就是采用接口隔离原则。

🦐特点

接口隔离原则是强调接口的方法尽量少,尽量细化接口,通过接口隔离原则可以使系统有以下优点

  • 可以降低类与类之间的耦合性;

  • 提高系统的稳定性;

  • 提高代码的可扩展性和可维护性;

  • 提高系统的高内聚。

🦑问题引出

还记得在初中的时候,还有上着音乐课这些艺术课,每每上音乐课这些艺术课时,感觉都是非常快乐滴!还记得以前音乐课时,老师弹着稻香的钢琴,我们同学大家都在合唱着“还记得你说家是唯一的城堡,随着稻香河流继续奔跑,微微笑,小时候的梦我知道~~~”但是这些快乐后面慢慢就消散了,被各种需要中考,高考等等需要大量的学习必修课后替代了。接下来我们就以不同年级时不同课程来讲解下接口隔离原则吧。

1. 建立一个初中的中学的课程类:

先建立一个大概包含初中所有年级的课程

package com.ygt.principle.isp;/*** 初中课程,包含着各中初中相关课程*/
public interface JuniorHighCourse {// 初中当然有语数英啦,这里就写数学了,毕竟就数学学得好点哈哈void mathematics();// 还有一些其他必修课如 历史,地理,物理等这里就写物理啦void physics();// 还有一些艺术课可以上 如 音乐美术等,这里写音乐课,毕竟画画不行哈哈void music();
}

2. 建立一个初中学生去学习初中课程:

初中学生去学习初中课程,没毛病老铁~

package com.ygt.principle.isp;/*** 建立一个初中学生去接收初中课程*  一旦实现了初中课程,就包含了所有的初中课程了*/
public class Ygt implements JuniorHighCourse {@Overridepublic void mathematics() {System.out.println("我爱上数学课~");}@Overridepublic void physics() {System.out.println("我爱上物理课~");}@Overridepublic void music() {System.out.println("我爱上音乐课~");}
}

3. 建立一个测试类ISPTest测试一下ygt的学习情况::

package com.ygt.principle.isp;/*** 接口隔离测试*/
public class ISPTest {public static void main(String[] args) {// 创建一个初中学生鱼罐头学习初中课程Ygt ygt = new Ygt();ygt.mathematics();ygt.physics();ygt.music();}
}

4. 得到的结果:

package com.ygt.principle.isp;/*** 接口隔离测试*/
public class ISPTest {public static void main(String[] args) {// 创建一个初中学生鱼罐头学习初中课程Ygt ygt = new Ygt();ygt.mathematics();ygt.physics();ygt.music();}
}

我们都知道,初中是分多个年级的,而每个年级学习的课程是有所不同的,所以如果每个年级的学生都只是实现一个初中课程,那是不是在高年级时学习的课程就会颇多呢,甚至高年级是没有体育、音乐等课程的,所以如果去实现初中课程,就会导致原本的课程是个空实现,而且我们把这些课程都集成在初中课程中,这就会导致初中课程的接口所拥有的职责过多,这也导致违反了接口隔离原则了,所以我们必须把课程分出来,或者是将不同年级的课程分别出来。下面就一起来看看解决方案吧。

🐙解决方案

在接口隔离的核心中,我们清楚知道一个类不应该依赖它不需要的接口,所以我们可以将每个课程都隔离独立出来成立一个新接口,或者将不同年级的课程确定好,这样每个年级的学生都能得到自己想要的初中课程学习啦。

1
. 分别建立不同课程的接口:

数学课

package com.ygt.principle.isp;/*** 数学课* 这个数学课,别说初中了,小学、高中、大学都还有呢*/
public interface IMathematics {void mathematics();
}

物理课

package com.ygt.principle.isp;/*** 物理课*  高中都有物理课,别放弃,学好物理化,走遍天下都不怕!*/
public interface IPhysics {void physics();
}

音乐课

package com.ygt.principle.isp;/*** 音乐课*/
public interface IMusic {void music();
}

2. 重新建立不同年级学生接收想要的课程:

张三

package com.ygt.principle.isp;/*** 建立一个初一的张三学习初一相关课程* (当然,这里的课程不全,这做展示演示~)*/
public class ZhangSan implements IMathematics, IPhysics, IMusic{@Overridepublic void mathematics() {System.out.println("张三不爱上数学课,张三只爱美女老师~");}@Overridepublic void music() {System.out.println("张三最爱上音乐课,音乐老师唱歌真好听~");}@Overridepublic void physics() {System.out.println("张三最不喜欢上物理课,就没有个美女物理老师吗~");}
}

李四

package com.ygt.principle.isp;/*** 建立一个初三的李四学习初一相关课程*  初三了,就没有音乐课这些啦~ 李四表示最喜欢上美术课,美术老师最好看~* (当然,这里的课程不全,这做展示演示~)*/
public class LiSi implements IMathematics, IPhysics{@Overridepublic void mathematics() {System.out.println("李四最爱上数学课了,老子李四数学排名全校第一~");}@Overridepublic void physics() {System.out.println("李四最爱上物理课了,老子李四最偏科,只偏爱美术课~");}
}

3. 测试一下不同学生上不同课程:

package com.ygt.principle.isp;/*** 接口隔离测试*/
public class ISPTest {public static void main(String[] args) {// 创建一个初中学生鱼罐头学习初中课程/*Ygt ygt = new Ygt();ygt.mathematics();ygt.physics();ygt.music();*/// 有请此时的初一法外狂徒张三学习初一课程ZhangSan zs = new ZhangSan();zs.mathematics();zs.physics();zs.music();// 有请初三的高年级李四学习初三课程LiSi ls = new LiSi();ls.mathematics();ls.physics();}
}

4. 得到的结果:

张三不爱上数学课,张三只爱美女老师~
张三最不喜欢上物理课,就没有个美女物理老师吗~
张三最爱上音乐课,音乐老师唱歌真好听~
李四最爱上数学课了,老子李四数学排名全校第一~
李四最爱上物理课了,老子李四最偏科,只偏爱美术课~

这样我们将初中课程隔离出来,成立不同的课程接口,这样每个年级的学生都能学习当前年级应该学习的课程啦,这就体现了一个类对另一个类的依赖应该建立在最少接口上,不会出现空实现的状态,当然工作中,不可能将接口中每个方法都隔离出现,毕竟写一个接口就一个方法也不现实,只要表明该接口是处于什么角色,即应该拥有什么职责即可。

🌸 完结

相信各位看官看到这里大致都对设计模式中的其中一个原则有了了解吧,接口隔离原则指一个类不应该依赖它不需要的接口,表明该接口是处于什么角色,即应该拥有什么职责即可。

学好设计模式,让你感受一些机械化代码之外的程序设计魅力,也可以让你理解各个框架底层的实现原理。最后,祝大家跟自己能在程序员这条越走越远呀,祝大家人均架构师,我也在努力。 接下来期待第六话:迪米特法则。 💪💪💪

文章的最后来个小小的思维导图:

🧐 本人不才,如有什么缺漏、错误的地方,也欢迎各位人才们评论批评指正!🤞🤞🤞

🤩 当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才们给个点赞、收藏下吧,非常感谢!🤗🤗🤗

🥂 虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!✨✨✨

💟 感谢各位看到这里!愿你韶华不负,青春无悔!让我们一起加油吧! 🌼🌼🌼

💖 学到这里,今天的世界打烊了,晚安!🌙🌙🌙

相关文章:

贯穿设计模式第五话--接口隔离原则

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 从今天开始,将…...

C语言计算机二级/C语言期末考试 刷题(四)

在空闲时间整理了一些C语言计算机二级和C语言期末考试题库 整理不易,大家点赞收藏支持一下 祝大家计算机二级和期末考试都高分过 系列文章: C语言计算机二级/C语言期末考试 刷题(一) C语言计算机二级/C语言期末考试 刷题&#x…...

JDK8中Stream接口的常用方法

参考答案 Stream 接口中的方法分为中间操作和终端操作,具体如下。 中间操作: filter:过滤元素map:映射,将元素转换成其他形式或提取信息flatMap:扁平化流映射limit:截断流,使其元…...

ThingsBoard源码解析-数据订阅与规则链数据处理

前言 结合本篇对规则链的执行过程进行探讨 根据之前对MQTT源码的学习,我们由消息的处理入手 //org.thingsboard.server.transport.mqtt.MqttTransportHandlervoid processRegularSessionMsg(ChannelHandlerContext ctx, MqttMessage msg) {switch (msg.fixedHeade…...

探究Transformer模型中不同的池化技术

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...

Android 9.0 设置讯飞语音引擎为默认tts语音播报引擎

1.前言 在9.0的系统rom定制化开发中,在产品开发中,一些内置的app需要用到tts语音播报功能,所以需要用到讯飞语音引擎作为默认的系统tts语音引擎功能,所以就需要 了解系统关于tts语音引擎默认的设置方法,然后在设置讯飞语音引擎为默认的tts语音引擎来实现tts语音播报功能的…...

直流无刷电机驱动的PWM频率

以下来源:Understanding the effect of PWM when controlling a brushless dc motorhttps://www.controleng.com/articles/understanding-the-effect-of-pwm-when-controlling-a-brushless-dc-motor/ Brushless dc motors have an electrical time constant τ of a…...

机房动环监控4大价值,轻松解决学校解决问题

不管是政府机构、学校、企业还是医院均有配备机房。机房一般配备服务器、计算机、存储设备、机柜组、UPS、精密空调等关键设备。 传统的机房在事故发生时,无法及时发现并处理,影响范围大,造成严重的损失。因此,一套智慧机房动环监…...

用于平抑可再生能源功率波动的储能电站建模及评价(Matlab代码实现)

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

Burpsuite详细教程

Burpsuite是一种功能强大的Web应用程序安全测试工具。它提供了许多有用的功能和工具,可以帮助用户分析和评估Web应用程序的安全性。在本教程中,我们将介绍如何安装、配置和使用Burpsuite,并提供一些常用的命令。 第一步:安装Burp…...

目标检测:FP(误检)和FN(漏检)统计

1. 介绍 目标检测,检测结果分为三类:TP(正确检测),FP(误检),FN(漏检), 尤其是针对复杂场景或者小目标检测场景中,会存在一些FP(误检),FN(漏检)。 如何对检测的效果进行可视化,以帮助我们改进模型,提高模型recall值。 步骤 (1): 数据需要准备为yolo格式(2) 训练数据获得…...

【MySQL专题】04、性能优化之读写分离(MyCat)

1、MyCat概述 从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的Server,前端用户可以把它看做是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生(Native&…...

信息系统项目管理师第四版知识摘编:第5章 信息系统工程

第5章 信息系统工程信息系统工程是用系统工程的原理、方法来指导信息系统建设与管理的一门工程技术学科,它是信息科学、管理科学、系统科学、计算机科学与通信技术相结合的综合性、交叉性、具有独特风格的应用学科。5.1软件工程软件工程是指应用计算机科学、数学及管…...

【2023春招】西山居游戏研发岗笔试AK

120min,一共三道算法、两道填空、10道不定项选择 算法题部分 T1-二叉树后序遍历 题面 一个节点数据为整数的二叉搜索树,它的遍历结果可以在内存中用一个整数数组来表示。比如,以下二叉树,它每个节点的左子节点都比自己小,右子节点都比自己大,对它进行后序遍历,结果可以…...

什么是分布式,分布式和集群的区别又是什么?

1. 什么是分布式 ? 分布式系统一定是由多个节点组成的系统。 其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。 这些连通的节点上部署了我们的节点,并且相互的操作会有协同。 分布式系统对于用户而言&a…...

Cellchat和Cellphonedb细胞互作一些问题的解决(error和可视化)

今日的内容主要解决两个问题,一个是cellchat的代码报错问题,因为已经有很多人提出这个问题了。第二个是Cellphonedb结果的可视化,这里提供一种免费的很实用的快捷可视化方法。其实这些问题只要自己思考都是能明白的。 Cellchat和cellphonedb细…...

大文件分片上传的实现【前后台完整版】

在一般的产品开发过程中,大家多少会遇到上传视频功能的需求,往往我们采用的都是对视频大小进行限制等方法,来防止上传请求超时,导致上传失败。这时候可能将视频分片上传可以对你的项目有一个小小的体验优化。 本片文章前端是vue&…...

Java序列化面试总结

Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节流的过程,而Java反序列化是指把字节流恢复为Java对象的过程。 序列化: 序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象…...

fs的常用方法

以下是fs模块的一些常用方法: 1. 读取文件内容 使用fs.readFile()方法读取文件内容。该方法接收两个参数:文件路径和回调函数。回调函数的参数包括错误信息和文件内容。 javascript const fs require(fs); fs.readFile(/path/to/file, (err, data)…...

【华为OD机试 2023最新 】字符串重新排列、字符串重新排序(C++ 100%)

文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出: 1、单词内部调整:对每个单词字母重新按字典序排序 2、单词间顺序调整: 1)统计每个单词出现的次数,并按次数降序排列 2)次数相同,按…...

Matlab自动消除论文插图白边的7种方法

通过Matlab所绘制的插图,如不进行一定的调整,其四周往往存在一定范围的白边。 白边的存在会影响数据展示效果,有时也会给论文的排版造成一定麻烦。 要想消除白边,一种简单的方法是,在导出插图后,用其它软…...

Python每日一练(20230330)

目录 1. 存在重复元素 🌟 2. 矩阵置零 🌟🌟 3. 回文对 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1…...

面试官:Tomcat 在 SpringBoot 中是如何启动的(二)

文章目录 总结彩蛋我们再看看Tomcat类的源码: //部分源码,其余部分省略。 public class Tomcat {//设置连接器public void setConnector(Connector connector) {Service service = getService(...

软件测试岗位中,如何顺利拿下50K+?送你一份涨薪秘籍

随着科技发展以及5G时代的到来,IT行业早已发生翻天覆地的变化。已不是当初你认为只要有好点子就能立马起盘做项目的时代了。在IT行业高速发展的时期中“软件测试行业”仍然是热门行业之一。软件行业的高速发展必然带来更多的岗位,正如IT行业发展需要有开…...

java webflux函数式实现数据结构

我前面写的文章 java webflux注解方式写一个可供web端访问的数据接口 带大家写了个注解方式实现的webflux 首先 使用函数式时 您需要自己初始化服务器 使用函数式需要两个接口 分别是 RouterFunction 和 HandlerFuncion RouterFunction主要的作用就是分别一下任务 例如 添加 直…...

百度文心一言可以完胜ChatGPT的4点可能性

文心一言,百度全新一代知识增强大语言模型,文心大模型家族的新成员,能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。但说实话,很多人拿他与ChatGPT相对比&#x…...

大型分布式架构设计

大型网站的特点 大型网站架构技术 大型网站架构技术-架构模式 大型网站架构技术-高性能架构 以用户为中心,提供快速的访问体验。主要体现在:响应快、并发能力高和性能稳定。 大型网站架构技术-高可用架构 大型网站在任何时候都应该可以正常访问&#…...

基于springboot实现校园在线拍卖电商系统【源码】

基于springboot实现校园在线拍卖系统演示开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&…...

SaaS智慧校园源码,电子班牌管理系统 人脸考勤、综合评价系统、请假管理、校务管理

Java智慧校园系统源码 智慧学校源码 小程序电子班牌,前后端分离架构 智慧校园全套源码包含:电子班牌管理系统、成绩管理系统、考勤人脸刷卡管理系统、综合素养评价系统、请假管理系统、电子班牌发布系统、校务管理系统、小程序移动端、教师后台管理系统…...

MONGODB mongodb 一般人不知道的数据类型与使用

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…...