当前位置: 首页 > 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)次数相同,按…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

HTML 列表、表格、表单

1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...