设计模式原则——接口隔离原则
设计模式原则
设计模式示例代码库地址:
https://gitee.com/Jasonpupil/designPatterns
接口隔离原则
- 要求程序员尽量将臃肿庞大的接口拆分为更小的和更具体的接口,让接口中只包含客户感兴趣的方法
- 接口隔离原则的目标是降低类或模块之间的耦合度,提高代码的可维护性、可扩展性和可测试性。
- 通过使用多个专门的接口,我们可以避免类或模块之间出现不必要的依赖关系,减少对无用接口的实现或调用,从而降低了修改和维护的成本。
模式场景:学校管理系统,不同角色的功能
- 接口隔离原则替换前:定义一个角色接口,包含几个功能:成绩查询、成绩上传和教师管理,所有角色都实现了这个接口,但是不同角色的权限不同,只能使用对应权限的功能,比如:学生只能成绩查询,而老师就可以成绩查询和成绩上传。如果都实现同一个接口,还需要进行每个功能进行隔离比较麻烦。
- 接口隔离原则替换后:把角色功能接口根据每个功能进行拆分,角色类实现对应权限的功能接口,这样就简化了角色类里实现功能隔离。
接口隔离原则替换前示例代码:功能没有具体实现,主要看逻辑是怎么样
角色功能接口:
/*** @Description: 角色接口* @Author: pupil* @Date: 2024/06/26 下午 11:29*/
public interface Role {/*** 成绩查询* @param userId 学生id* @return*/String scoreInquiry(long userId);/*** 成绩上传* @param userId 学生id* @param grades 成绩*/void gradeUpload(long userId, Map<String,Double> grades);/*** 教师管理* @param teacherId 教师id*/void teacherManagement(long teacherId);}
校长类:
/*** @Description: 校长,功能没有具体实现* @Author: pupil* @Date: 2024/06/26 下午 11:30*/
public class Principal implements Role {private Logger logger = LoggerFactory.getLogger(Principal.class);@Overridepublic String scoreInquiry(long userId) {logger.info("学生{}:成绩是....",userId);return null;}@Overridepublic void gradeUpload(long userId, Map<String, Double> grades) {// 无法实现该功能}@Overridepublic void teacherManagement(long teacherId) {logger.info("教师{}: 进行管理",teacherId);}
}
教师类:
/*** @Description: 教师* @Author: pupil* @Date: 2024/06/26 下午 11:31*/
public class Teacher implements Role {private Logger logger = LoggerFactory.getLogger(Teacher.class);@Overridepublic String scoreInquiry(long userId) {logger.info("学生{}:成绩是....",userId);return null;}@Overridepublic void gradeUpload(long userId, Map<String, Double> grades) {logger.info("学生{}:成绩上传为{}",userId,grades);}@Overridepublic void teacherManagement(long teacherId) {// 无法实现该功能}
}
学生类:
/*** @Description: 学生* @Author: pupil* @Date: 2024/06/26 下午 11:31*/
public class Student implements Role {private Logger logger = LoggerFactory.getLogger(Student.class);@Overridepublic String scoreInquiry(long userId) {logger.info("学生{}:成绩是....",userId);return null;}@Overridepublic void gradeUpload(long userId, Map<String, Double> grades) {// 无法实现该功能}@Overridepublic void teacherManagement(long teacherId) {// 无法实现该功能}
}
接口隔离原则替换后示例代码:功能没有具体实现,主要看逻辑是怎么样
成绩查询功能接口:
/*** @Description: 成绩查询功能接口* @Author: pupil* @Date: 2024/06/26 下午 11:56*/
public interface ScoreInquiry {/*** 成绩查询* @param userId 学生id* @return*/String scoreInquiry(long userId);
}
成绩上传功能接口:
/*** @Description: 成绩上传功能接口* @Author: pupil* @Date: 2024/06/26 下午 11:56*/
public interface GradeUpload {/*** 成绩上传* @param userId 学生id* @param grades 成绩*/void gradeUpload(long userId, Map<String,Double> grades);
}
教师管理功能接口:
/*** @Description: 教师管理功能接口* @Author: pupil* @Date: 2024/06/27 上午 12:01*/
public interface TeacherManagement {/*** 教师管理* @param teacherId 教师id*/void teacherManagement(long teacherId);
}
校长类:
/*** @Description: 校长,功能没有具体实现* @Author: pupil* @Date: 2024/06/26 下午 11:30*/
public class Principal implements ScoreInquiry, TeacherManagement {private Logger logger = LoggerFactory.getLogger(Principal.class);@Overridepublic String scoreInquiry(long userId) {logger.info("学生{}:成绩是....", userId);return null;}@Overridepublic void teacherManagement(long teacherId) {logger.info("教师{}: 进行管理", teacherId);}}
教师类:
/*** @Description: 教师,功能没有具体实现* @Author: pupil* @Date: 2024/06/26 下午 11:31*/
public class Teacher implements ScoreInquiry, GradeUpload {private Logger logger = LoggerFactory.getLogger(Teacher.class);@Overridepublic String scoreInquiry(long userId) {logger.info("学生{}:成绩是....",userId);return null;}@Overridepublic void gradeUpload(long userId, Map<String, Double> grades) {logger.info("学生{}:成绩上传为{}",userId,grades);}}
学生类:
/*** @Description: 学生,功能没有具体实现* @Author: pupil* @Date: 2024/06/26 下午 11:31*/
public class Student implements ScoreInquiry {private Logger logger = LoggerFactory.getLogger(Student.class);@Overridepublic String scoreInquiry(long userId) {logger.info("学生{}:成绩是....",userId);return null;}
}
根据接口隔离原则的示例类图:

相关文章:
设计模式原则——接口隔离原则
设计模式原则 设计模式示例代码库地址: https://gitee.com/Jasonpupil/designPatterns 接口隔离原则 要求程序员尽量将臃肿庞大的接口拆分为更小的和更具体的接口,让接口中只包含客户感兴趣的方法接口隔离原则的目标是降低类或模块之间的耦合度&…...
MySQL数据库——在Centos7环境安装
MySQL在Centos7环境安装 1.切换root用户 安装与卸载中,用户全部切换成为root,安装好后,普通用户也能使用 2.卸载不要的环境 要将自己环境中有关mysql的全都删除,避免安装过程中被影响 ps axj | grep mariadb 先检查是否有mari…...
怎样规避液氮容器内部结霜的问题
液氮容器内部结霜问题一直是我们在使用液氮储存罐时遇到的一个棘手难题。液氮的极低温度使得容器内部很容易产生结霜现象,这不仅影响了容器的正常使用,还可能对内部样品或设备造成损坏。因此,如何有效规避液氮容器内部结霜问题成为了每个使用…...
冶金工业5G智能工厂工业物联数字孪生平台,推进制造业数字化转型
冶金工业5G智能工厂工业物联数字孪生平台,推进制造业数字化转型。传统生产方式难以满足现代冶金工业的发展需求,数字化转型成为必然趋势。通过引入5G、工业物联网和数字孪生等先进技术,冶金工业可以实现生产过程智能化、高效化和绿色化&#…...
一文入门机器学习参数调整实操
作者前言: 通过向身边的同事大佬请教之后,大佬指点我把本文的宗旨从“参数调优”改成了“参数调整”。实在惭愧,暂时还没到能“调优”的水平,本文只能通过实操演示“哪些操作会对数据训练产生影响”,后续加深学习之后,…...
基于51单片机的银行排队呼叫系统设计
一.硬件方案 本系统是以排队抽号顺序为核心,客户利用客户端抽号,工作人员利用叫号端叫号;通过显示器及时显示当前所叫号数,客户及时了解排队信息,通过合理的程序结构来执行排队抽号。电路主要由51单片机最小系统LCD12…...
JXCategoryView的使用总结
一、初始化 -(JXCategoryTitleView *)categoryView{if (!_categoryView) {_categoryView [[JXCategoryTitleView alloc] init];_categoryView.delegate self;_categoryView.titleDataSource self;_categoryView.averageCellSpacingEnabled NO; //是否平均分配项目之间的间…...
Centos9 安装VBox增强功能问题
安装步骤 更新gcc 首先手动更新gcc,防止无法兼容最新版本的内核,我这里将gcc 11更新到gcc 13 1.首先更新当前gcc和支持 yum install -y gcc gcc-c 2.下载新版本gcc压缩包 wget http://ftp.gnu.org/gnu/gcc/gcc-13.1.0/gcc-13.1.0.tar.gz 解压到usr ta…...
【JVM】Java虚拟机运行时数据分区介绍
JVM 分区(运行时数据区域) 文章目录 JVM 分区(运行时数据区域)前言1. 程序计数器2. Java 虚拟机栈3. 本地方法栈4. Java 堆5. 方法区6. 运行时常量池7. 直接内存 前言 之前在说多线程的时候,提到了JVM虚拟机的分区内存…...
大数据面试题之Kafka(2)
目录 Kafka的工作原理? Kafka怎么保证数据不丢失,不重复? Kafka分区策略 Kafka如何尽可能保证数据可靠性? Kafka数据丢失怎么处理? Kafka如何保证全局有序? 生产者消费者模式与发布订阅模式有何异同? Kafka的消费者组是如何消费数据的 Kafka的…...
前端面试题(基础篇十一)
一、DOCTYPE 的作用是什么? <!DOCTYPE> 声明一般位于文档的第一行,它的作用主要是告诉浏览器以什么样的模式来解析文档。一般指定了之后会以标准模式来进行文档解析,否则就以兼容模式进行解析。在标准模式下,浏览器的解析规…...
【论文阅读】Answering Label-Constrained Reachability Queries via Reduction Techniques
Cai Y, Zheng W. Answering Label-Constrained Reachability Queries via Reduction Techniques[C]//International Conference on Database Systems for Advanced Applications. Cham: Springer Nature Switzerland, 2023: 114-131. Abstract 许多真实世界的图都包含边缘标签…...
Git Flow 工作流学习要点
Git Flow 工作流学习要点 Git Flow — 流程图Git Flow — 操作指令优点:缺点:Git Flow 分支类型Git Flow 工作流程简述关于 feature 分支关于 Release 分支关于 hotfix 分支 总结 Git Flow — 流程图 图片来源:https://nvie.com/posts/a-succ…...
blender 快捷键 常见问题
一、快捷键 平移视图:Shift 鼠标中键旋转视图:鼠标中键缩放视图:鼠标滚动框选放大模型:Shift B线框预览和材质预览切换:Shift Z 二、常见问题 问题:导入模型成功,但是场景中看不到。 解…...
HTTP详解:TCP三次握手和四次挥手
一、TCP协议概述 TCP协议是互联网协议栈中传输层的核心协议之一,它提供了一种可靠的数据传输方式,确保数据包按顺序到达,并且没有丢失或重复。TCP的主要特点包括: 面向连接:TCP在传输数据之前需要建立连接。可靠传输&…...
详解HTTP:有了HTTP,为何需要WebSocket?
在日常生活中,HTTP 常用于请求数据。例如,当你打开一个天气预报网站时,浏览器会发送一个 HTTP 请求到服务器,请求当前的天气数据,服务器返回响应,浏览器解析并显示这些数据。 但是,当涉及到需要…...
Spring Boot 启动流程是怎么样的
引言 SpringBoot是一个广泛使用的Java框架,旨在简化基于Spring框架的应用程序的开发过程。在这篇文章中,我们将深入探讨SpringBoot应用程序的启动流程,了解其背后的机制。 Spring Boot 启动概览 SpringBoot应用程序的启动通常从一个包含 m…...
【学习笔记】数据结构(三)
栈和队列 文章目录 栈和队列3.1 栈 - Stack3.1.1 抽象数据类型栈的定义3.1.2 栈的表示和实现 3.2 栈的应用举例3.2.1 数制转换3.2.2 括号匹配的检验3.2.3 迷宫求解3.2.4 表达式求值 - 波兰、逆波兰3.2.5 反转一个字符串或者反转一个链表 3.3 栈与递归的实现3.4 队列 - Queue3.4…...
学习python笔记:10,requests,enumerate,numpy.array
requests库,用于发送 HTTP 请求的 Python 库。 requests 是一个用于发送 HTTP 请求的 Python 库。它使得发送 HTTP 请求变得简单且人性化。以下是一些基本的 requests 函数及其用途: requests.get(url, **kwargs) 发送一个 GET 请求到指定的 URL。 i…...
经典神经网络(13)GPT-1、GPT-2原理及nanoGPT源码分析(GPT-2)
经典神经网络(13)GPT-1、GPT-2原理及nanoGPT源码分析(GPT-2) 2022 年 11 月,ChatGPT 成功面世,成为历史上用户增长最快的消费者应用。与 Google、FaceBook等公司不同,OpenAI 从初代模型 GPT-1 开始,始终贯彻只有解码器࿰…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
