SOLID原则学习,接口隔离原则

在这里插入图片描述

文章目录

  • 1. 定义
  • 2. 为什么要遵循接口隔离原则?
  • 3. 违反接口隔离原则的例子
  • 4. 遵循接口隔离原则的改进
  • 5. 总结


1. 定义

接口隔离原则(Interface Segregation Principle, ISP)
接口隔离原则是面向对象设计中的五大原则(SOLID)之一,由Robert C. Martin提出。其核心思想是:

客户端不应该依赖它们不需要的接口。

换句话说,一个类不应该被迫实现它不需要的方法。接口应该尽量细化,每个接口只负责一个特定的功能,而不是将所有功能都集中在一个庞大的接口中。


2. 为什么要遵循接口隔离原则?

1. 减少耦合:细化的接口可以减少类之间的依赖,降低耦合度。

2. 提高可维护性:当接口职责单一,修改一个接口不会影响到其他不相关的类。

3. 增强可读性:细化的接口更容易理解和维护。


3. 违反接口隔离原则的例子

假设我们有一个IMachine接口,定义了打印机、扫描仪和传真机的功能:

class IMachine {
public:virtual void print(const std::string& document) = 0;virtual void scan(const std::string& document) = 0;virtual void fax(const std::string& document) = 0;
};

然后我们有一个Printer类,它只需要实现打印功能:

class Printer : public IMachine {
public:void print(const std::string& document) override {// 实现打印功能}void scan(const std::string& document) override {// 打印机不需要扫描功能,但被迫实现throw std::runtime_error("Not implemented");}void fax(const std::string& document) override {// 打印机不需要传真功能,但被迫实现throw std::runtime_error("Not implemented");}
};

在这个例子中,Printer类被迫实现了scan和fax方法,尽管它并不需要这些功能。这违反了接口隔离原则。


4. 遵循接口隔离原则的改进

我们可以将IMachine接口拆分为多个更小的接口,每个接口只负责一个功能:

class IPrinter {
public:virtual void print(const std::string& document) = 0;
};class IScanner {
public:virtual void scan(const std::string& document) = 0;
};class IFax {
public:virtual void fax(const std::string& document) = 0;
};

然后,Printer类只需要实现IPrinter接口:

class Printer : public IPrinter {
public:void print(const std::string& document) override {// 实现打印功能}
};

如果有一个多功能设备,比如MultiFunctionMachine,它可以同时实现多个接口:

class MultiFunctionMachine : public IPrinter, public IScanner, public IFax {
public:void print(const std::string& document) override {// 实现打印功能}void scan(const std::string& document) override {// 实现扫描功能}void fax(const std::string& document) override {// 实现传真功能}
};

5. 总结

通过将庞大的接口拆分为多个小接口,我们可以确保每个类只实现它所需要的功能,避免了不必要的依赖和复杂性。这不仅提高了代码的可维护性,还使得系统更加灵活和可扩展。

关键点
1. 接口职责单一:每个接口只负责一个功能。

2. 避免强迫实现不需要的方法:类不应该被迫实现它不需要的方法。

3. 提高灵活性:细化的接口使得系统更容易扩展和修改。

遵循接口隔离原则可以帮助我们设计出更加清晰、灵活和可维护的系统。

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

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

相关文章

测试开发之面试宝典

目录 session和cookie的区别 session和cookie的区别 1.session和cookie都是鍵值对应的 2.session和cookie都是服务器生成的,session的ID,即服各器用来识别读取session对象的一把钥匙 3.session是保存在服各器端,而cookie是返回給客戶端的&…

Jenkins-持续集成、交付、构建、部署、测试

Jenkins-持续集成、交付、构建、部署、测试 一: Jenkins 介绍1> Jenkins 概念2> Jenkins 目的3> Jenkins 特性4> Jenkins 作用 二:Jenkins 版本三:DevOps流程简述1> 持续集成(Continuous Integration,CI&#xff0…

SQL进阶实战技巧:统计相同时刻多地登陆的用户?

目录 0 问题描述 1 数据准备 2 代码实现 3 问题拓展 3.1 查询每个用户登录日期的最大空档期

BurpSuite之FUZZ模糊测试

Fuzz会生成大量的随机数据对目标网站进行测试,去挖掘可能存在的漏洞,类似密码爆破,但是fuzz针对的是漏洞进行爆破,它也有自己的爆破字典 (fuzz用的好漏洞少不了) 哪些网站要用fuzz呢? 1. 当最目标网站没有更好的办法的时候就可以使用fuzz尝试爆破测试。 2. 目标网站什么都…

从0到机器视觉工程师(六):配置OpenCV和Qt环境

CMake配置OpenCV CMakeLists.txt文件的编写 cmake_minimum_required(VERSION 3.20) project(test_opencv LANGUAGES CXX) #寻找Opencv库 FIND_PACKAGE(OpenCV REQUIRED) include_directories(test_opencv ${OpenCV_INCLUDE_DIRS}) add_executable(test_opencv main.cpp) TARGE…

Vue3框架核心功能点响应式数据reactive、组合式API setup、computed、组件通信、路由导航,状态管理vuex、pinia等的实战示例代码

记录几个Vue3框架核心功能点,例如响应式数据reactive、组合式API setup、computed、组件通信、路由导航,状态管理vuex、pinia……等实战示例代码: 一、响应式数据(Reactive Data) 创建响应式对象 使用reactive函数创建…

svelte5中使用react组件

在svelet5中导入并使用react组件库 svelte5中使用react组件 svelte5中使用react组件 在svelet5中导入并使用react组件库, 示例项目地址:https://github.com/shenshouer/my-svelte-react 在svelte5中当前还有问题,无法将children传递到react中渲染 使用…

R语言装环境Gcc报错以及scater包的安装

error: ‘timespec_get’ has not been declared in ‘::’ 80 | using ::timespec_get; 在conda 的虚拟环境中升级gcc的版本 conda install -c conda-forge gcc11 gxx11终极方法,在R的最新版本和环境下装啥都能成功!! 比如beyondcell的方法…

CDA数据分析师一级经典错题知识点总结(3)

1、SEMMA 的基本思想是从样本数据开始,通过统计分析与可视化技术,发现并转换最有价值的预测变量,根据变量进行构建模型,并检验模型的可用性和准确性。【强调探索性】 2、CRISP-DM模型Cross Industry Standard Process of Data Mi…

Flink概念知识讲解之:Restart重启策略配置

Flink概念知识讲解之:Restart重启策略配置 当 Task 发生故障时,Flink 需要重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。 Flink 通过重启策略和故障恢复策略来控制 Task 重启:重启策略决定是否可以…

VUE3 VITE项目在 npm 中,关于 Vue 的常用命令有一些基础命令

如果你正在使用 Vite 构建的 Vue 3 项目,并且想要使用相关的 Vue 和 Vite 工具,下面是一些常用的命令和步骤来创建和管理 Vue 项目。 1. 使用 npm create 创建 Vue 3 项目(Vite) 如果你还没有创建项目,可以使用以下命…

微服务电商平台课程七:前端框架vue

后台商城: https://github.com/macrozheng/mall-admin-web 前台商城:https://github.com/macrozheng/mall-app-web Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编…

【Uniapp-Vue3】v-for列表渲染的用法

如果我们想要重复渲染多个元素,就可以使用v-for进行渲染。 比如我们想要将元素渲染5次: 如果我们想要知道当前元素是渲染的第几个,可以在v-for的时候添加参数index,并在差值表达式中填入index: 则index会以0开始进行渲…

《新闻大厦抢先版》V0.18.105+Dlcs官方学习版

《新闻大厦抢先版》官方版https://pan.xunlei.com/s/VODaeUn3v-ZWVvvmUMfo5AqWA1?pwdnhpz# 建造并不断优化新闻大楼,保障员工权益并及时赶上周日的印刷交期! 招募并管理不同职业以登上成功的阶梯:记者、摄像师、勤杂工,除此以外…

解锁3D模型转换:STL转OBJ全攻略

一、3D模型转换的基石:STL与OBJ格式概览 在3D模型的世界里,STL和OBJ格式犹如两大基石,支撑着模型创建、编辑、转换与应用的方方面面。了解它们的特性,是深入探究3D模型转换的关键第一步。 1.1 STL格式深度剖析 STL 全称为Stereo…

OpenAI的对话和图像API简单体验

OpenAI的对话和图像API简单体验 前言OpenAI API 对话和图像接口PythonJavaScript Azure OpenAI API 对话和图像接口PythonJavaScript 总结 前言 JS 和 Python 是比较受欢迎的两个调用 OpenAI 对话 API 的两个库, 这里 简单记录这两个库对 OpenAI 的对话(Chat)和图像(Image)的使…

RK3568 Android 13 内置搜狗输入法小计

问:为什么写? 答:网上搜出来的都试过了,不行!下面直接上代码和注意事项! 首先到这个目录(/RK3568/Rockchip_Android13_SDK_Release/device/rockchip/rk356x/tl3568_evm/preinstall&#xff09…

windows10下安装Microsoft SQL Server 2016

一、下载安装包 网站:MSDN, 我告诉你 - 做一个安静的工具站 选择需要的版本,点击详细信息,复制ed2k链接,打开eMule或迅雷,新建下载,粘贴链接,开始下载。 下载好的文件是一个.iso镜像文件。 二、…

探索图像编辑的无限可能——Adobe Photoshop全解析

文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里,视觉内容无处不在,而创建和编辑这些内容的能力已经成为许多行业的核心技能…

IDEA Maven构建时报错:无效的目标发行版17

报错分析 报错原因:Maven 构建时,Java 版本配置不匹配 我安装的JDK版本是1.8,但由于种种原因,Maven构建时指定了 Java 17 作为目标发行版,从而导致错误 解决方案 首先,java -version,查看环…