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

设计模式原则——接口隔离原则

设计模式原则

设计模式示例代码库地址:

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;}
}

根据接口隔离原则的示例类图:

在这里插入图片描述

相关文章:

设计模式原则——接口隔离原则

设计模式原则 设计模式示例代码库地址&#xff1a; https://gitee.com/Jasonpupil/designPatterns 接口隔离原则 要求程序员尽量将臃肿庞大的接口拆分为更小的和更具体的接口&#xff0c;让接口中只包含客户感兴趣的方法接口隔离原则的目标是降低类或模块之间的耦合度&…...

MySQL数据库——在Centos7环境安装

MySQL在Centos7环境安装 1.切换root用户 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;安装好后&#xff0c;普通用户也能使用 2.卸载不要的环境 要将自己环境中有关mysql的全都删除&#xff0c;避免安装过程中被影响 ps axj | grep mariadb 先检查是否有mari…...

怎样规避液氮容器内部结霜的问题

液氮容器内部结霜问题一直是我们在使用液氮储存罐时遇到的一个棘手难题。液氮的极低温度使得容器内部很容易产生结霜现象&#xff0c;这不仅影响了容器的正常使用&#xff0c;还可能对内部样品或设备造成损坏。因此&#xff0c;如何有效规避液氮容器内部结霜问题成为了每个使用…...

冶金工业5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

冶金工业5G智能工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。传统生产方式难以满足现代冶金工业的发展需求&#xff0c;数字化转型成为必然趋势。通过引入5G、工业物联网和数字孪生等先进技术&#xff0c;冶金工业可以实现生产过程智能化、高效化和绿色化&#…...

一文入门机器学习参数调整实操

作者前言: 通过向身边的同事大佬请教之后&#xff0c;大佬指点我把本文的宗旨从“参数调优”改成了“参数调整”。实在惭愧&#xff0c;暂时还没到能“调优”的水平&#xff0c;本文只能通过实操演示“哪些操作会对数据训练产生影响”&#xff0c;后续加深学习之后&#xff0c;…...

基于51单片机的银行排队呼叫系统设计

一.硬件方案 本系统是以排队抽号顺序为核心&#xff0c;客户利用客户端抽号&#xff0c;工作人员利用叫号端叫号&#xff1b;通过显示器及时显示当前所叫号数&#xff0c;客户及时了解排队信息&#xff0c;通过合理的程序结构来执行排队抽号。电路主要由51单片机最小系统LCD12…...

JXCategoryView的使用总结

一、初始化 -(JXCategoryTitleView *)categoryView{if (!_categoryView) {_categoryView [[JXCategoryTitleView alloc] init];_categoryView.delegate self;_categoryView.titleDataSource self;_categoryView.averageCellSpacingEnabled NO; //是否平均分配项目之间的间…...

Centos9 安装VBox增强功能问题

安装步骤 更新gcc 首先手动更新gcc&#xff0c;防止无法兼容最新版本的内核&#xff0c;我这里将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 分区&#xff08;运行时数据区域&#xff09; 文章目录 JVM 分区&#xff08;运行时数据区域&#xff09;前言1. 程序计数器2. Java 虚拟机栈3. 本地方法栈4. Java 堆5. 方法区6. 运行时常量池7. 直接内存 前言 之前在说多线程的时候&#xff0c;提到了JVM虚拟机的分区内存…...

大数据面试题之Kafka(2)

目录 Kafka的工作原理? Kafka怎么保证数据不丢失&#xff0c;不重复? Kafka分区策略 Kafka如何尽可能保证数据可靠性? Kafka数据丢失怎么处理? Kafka如何保证全局有序? 生产者消费者模式与发布订阅模式有何异同? Kafka的消费者组是如何消费数据的 Kafka的…...

前端面试题(基础篇十一)

一、DOCTYPE 的作用是什么&#xff1f; <!DOCTYPE> 声明一般位于文档的第一行&#xff0c;它的作用主要是告诉浏览器以什么样的模式来解析文档。一般指定了之后会以标准模式来进行文档解析&#xff0c;否则就以兼容模式进行解析。在标准模式下&#xff0c;浏览器的解析规…...

【论文阅读】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 — 操作指令优点&#xff1a;缺点&#xff1a;Git Flow 分支类型Git Flow 工作流程简述关于 feature 分支关于 Release 分支关于 hotfix 分支 总结 Git Flow — 流程图 图片来源&#xff1a;https://nvie.com/posts/a-succ…...

blender 快捷键 常见问题

一、快捷键 平移视图&#xff1a;Shift 鼠标中键旋转视图&#xff1a;鼠标中键缩放视图&#xff1a;鼠标滚动框选放大模型&#xff1a;Shift B线框预览和材质预览切换&#xff1a;Shift Z 二、常见问题 问题&#xff1a;导入模型成功&#xff0c;但是场景中看不到。 解…...

HTTP详解:TCP三次握手和四次挥手

一、TCP协议概述 TCP协议是互联网协议栈中传输层的核心协议之一&#xff0c;它提供了一种可靠的数据传输方式&#xff0c;确保数据包按顺序到达&#xff0c;并且没有丢失或重复。TCP的主要特点包括&#xff1a; 面向连接&#xff1a;TCP在传输数据之前需要建立连接。可靠传输&…...

详解HTTP:有了HTTP,为何需要WebSocket?

在日常生活中&#xff0c;HTTP 常用于请求数据。例如&#xff0c;当你打开一个天气预报网站时&#xff0c;浏览器会发送一个 HTTP 请求到服务器&#xff0c;请求当前的天气数据&#xff0c;服务器返回响应&#xff0c;浏览器解析并显示这些数据。 但是&#xff0c;当涉及到需要…...

Spring Boot 启动流程是怎么样的

引言 SpringBoot是一个广泛使用的Java框架&#xff0c;旨在简化基于Spring框架的应用程序的开发过程。在这篇文章中&#xff0c;我们将深入探讨SpringBoot应用程序的启动流程&#xff0c;了解其背后的机制。 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库&#xff0c;用于发送 HTTP 请求的 Python 库。 requests 是一个用于发送 HTTP 请求的 Python 库。它使得发送 HTTP 请求变得简单且人性化。以下是一些基本的 requests 函数及其用途&#xff1a; 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 月&#xff0c;ChatGPT 成功面世&#xff0c;成为历史上用户增长最快的消费者应用。与 Google、FaceBook等公司不同&#xff0c;OpenAI 从初代模型 GPT-1 开始&#xff0c;始终贯彻只有解码器&#xff0…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...