设计原则 | 接口隔离原则

一、接口隔离原则

1、原理

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。如果强迫客户端依赖于那些它们不使用的接口,那么客户端就面临着这个未使用的接口的改变所带来的变更,这无意间导致了客户程序之间的耦合。换种说法,如果一个客户程序依赖于一个含有它不使用的方法的类,但是其他客户程序确需要使用该方法,那么当其他客户要求这个类改变时,就会影响到这个客户程序。我们希望尽可能地避免这种耦合,因此我们希望分离接口。

2、示例

2.1、迭代一

A类通过接口依赖B类,B类实现接口全部方法,但是A类只使用B类的func1、func2、func3等三个方法;C类通过接口依赖D类,D类实现接口全部方法,C类使用到接口的func1、func4、func5等三个方法。UML类图,如下:

在这里插入图片描述

代码如下:

#include <iostream>
using namespace std;// Interface 接口
class Interface
{
public:virtual void func1();virtual void func2();virtual void func3();virtual void func4();virtual void func5();
};// B 类
class B : public Interface
{
public:void func1(){cout << "B 类实现 func1" << endl;}void func2(){cout << "B 类实现 func2" << endl;}void func3(){cout << "B 类实现 func3" << endl;}void func4(){cout << "B 类实现 func4" << endl;}void func5(){cout << "B 类实现 func5" << endl;}
};// D 类
class D : public Interface
{
public:void func1(){cout << "D 类实现 func1" << endl;}void func2(){cout << "D 类实现 func2" << endl;}void func3(){cout << "D 类实现 func3" << endl;}void func4(){cout << "D 类实现 func4" << endl;}void func5(){cout << "D 类实现 func5" << endl;}
};// 1、A类 通过Interface接口 依赖B类
// 2、A类使用到接口的1、2、3等三个方法
class A {
public:void depend1(Interface &i){i.func1();}void depend2(Interface &i){i.func2();}void depend3(Interface &i){i.func3();}
};// 1、C类 通过Interface接口 依赖D类
// 2、C类使用到接口的1、4、5等三个方法
class C {
public:void depend1(Interface &i){i.func1();}void depend4(Interface &i){i.func4();}void depend5(Interface &i){i.func5();}
};int main()
{B objB;D objD;A objA;C objC;objA.depend1(objB);objA.depend2(objB);objA.depend3(objB);objC.depend1(objD);objC.depend4(objD);objC.depend5(objD);return 0;
}

上面代码存在的问题

  • 接口对于类A与类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法

2.2、迭代二

按照接口分离原则,类A与类C分别于他们需要的接口建立依赖关系,修改后的类图如下:

在这里插入图片描述

3、结论

胖类会导致它们的客户程序之间产生不正常的并且有害的耦合关系。当一个客户程序要求该胖类进行一个改动时,会影响到其他的所有的客户程序。因此、客户程序应该仅仅依赖于它们实际调用的方法。通过把胖类的接口分解为多个特定于客户程序的接口,可以实现这个目标。

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

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

相关文章

【MySQL】MySQL库的操作

MySQL库的操作 一、创建数据库创建数据库案例字符集和校验规则校验规则对数据库的影响 二、操纵数据库1、查看数据库2、查看当前正在使用的数据库3、使用数据库4、显示创建语句5、数据库删除6、数据库的修改7、备份和恢复8、查看连接情况 一、创建数据库 创建数据库的语法如下…

计网 - TCP扫盲

文章目录 知识点TCP头格式TCP有限状态机&#xff08;FSM&#xff09;为何需要TCP协议TCP的定义TCP连接的概念如何唯一确定一个TCP连接TCP vs UDPTCP拥塞控制TCP流量控制 导图 知识点 TCP头格式 TCP头部包含多个字段&#xff0c;其中一些是必需的&#xff0c;而另一些是可选的…

MySQL笔记-第18章_MySQL8其它新特性

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第18章_MySQL8其它新特性1. MySQL8新特性概述1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性 2. 新特性1&#xff1a;窗口函数2.1 使用窗口…

机器人说明书---名词解释017课_C++语言_多态

目录 多态基类被派生为两个类编译器看的是指针的内容 视频讲解 多态 多态按字面的意思就是多种形态。当类之间存在层次结构&#xff0c;并且类之间是通过继承关联时&#xff0c;就会用到多态。 C 多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的…

数据结构实验任务八:排序算法的实现与分析

问题描述 统计成绩&#xff1a;给出 n 个学生的考试成绩表&#xff0c;每条信息由姓名和分数组成&#xff0c;试设 计一个算法&#xff1a; 1.按分数高低次序&#xff0c;打印出每个学生在考试中获得的名次&#xff0c;分数相同的为同 一名次&#xff1b; 2.按名次列出每个学生…

性能优化 vue2/vue3 通过CDN 减少项目启动时间

其实更多可以通过压缩图片等文件大小 也会让项目运行快一些 以及尽量使用异步或者懒加载 使用CDN可以避免在项目中使用npm导入Vue的依赖项&#xff0c;从而减少项目启动时的加载时间 使用方法如下 <!-- Vue 2 --> <script src"https://cdn.jsdelivr.net/npm/vue…

前端:兼容 cookie 和 localStorage 类,且可设置过期时限

前言 兼容 Cookie 和 localStorage 两种方式&#xff0c;且都可设置过期时限&#xff1b; 初始化 init(type, timeOut) 参数 名称类型描述typeString存储方式。支持 2 种类型&#xff1a;cookie&#xff08;存储值最大为 4KB&#xff09;、localStorage(存储值最大为 5M)t…

解码大语言模型奥秘:《大规模语言模型:从理论到实践》震撼上市!

2022年11月&#xff0c;ChatGPT的问世展示了大模型的强大潜能&#xff0c;对人工智能领域有重大意义&#xff0c;并对自然语言处理研究产生了深远影响&#xff0c;引发了大模型研究的热潮。 距ChatGPT问世不到一年&#xff0c;截至2023年10月&#xff0c;国产大模型玩家就有近2…

(1)(1.7) HOTT telemetry

文章目录 前言 1 布线和设置 2 参数说明 前言 Plane-4.0.0&#xff08;及更高版本&#xff09;、Copter-4.0.4&#xff08;及更高版本&#xff09;和 Rover-4.1.0&#xff08;及更高版本&#xff09;支持 Graupner HOTT 遥测技术。 1 布线和设置 与自动驾驶仪的连接可通过…

常用的线程锁

常用的锁 互斥锁&#xff08;Mutex Lock&#xff09; 用于保护共享资源&#xff0c;一次只允许一个线程访问共享资源&#xff0c;其他线程需要等待锁释放后才能访问。互斥锁是最常见的锁类型&#xff0c;用于避免多个线程同时访问共享资源而导致的数据竞争和不一致性。 读写锁…

C#基础——数组Array、数组API

C#基础——数组Array、数组API 1、数组&#xff1a;按照指定顺序存储指定数量的相同类型的值 声明数组 // 数组的长度根据存储值的数量进行自动推断int[] ints1 new int[] { 2, 4, 6, 8 };//可以简写为int[] ints2 { 2, 4, 6, 8 };// 定义数组时&#xff0c;指定数组长度in…

小间距LED显示屏的芯片扮演的关键角色

LED屏幕由数万颗灯珠封装而成&#xff0c;包含驱动芯片、PCB板、电阻、电容、模组套件和箱体等&#xff0c;形成一块高清LED显示屏。芯片的质量直接影响整个屏幕的品质、稳定性和性能。那么&#xff0c;什么是细间距LED显示屏&#xff1f;小间距LED显示屏芯片具体有何作用呢&am…

react-router-dom v6中优雅处理404重定向问题

在基于React的单页面应用&#xff08;SPA&#xff09;中&#xff0c;使用 react-router-dom 库来管理路由是一项关键任务。当用户访问一个不存在的页面时&#xff0c;我们通常希望能够以优雅的方式处理404情况&#xff0c;从而提升用户体验。本文将探讨如何在React应用中使用re…

OpenAI 承认 ChatGPT 最近确实变懒,承诺修复问题

文章目录 一. ChatGPT 指令遵循能力下降引发用户投诉1.1 用户抱怨回应速度慢、敷衍回答、拒绝回答和中断会话 二. OpenAI 官方确认 ChatGPT 存在问题&#xff0c;展开调查三. OpenAI 解释模型行为差异&#xff0c;回应用户质疑四. GPT-4 模型变更受人事动荡和延期影响 一. Chat…

【小沐学Python】Python实现语音识别(Whisper)

文章目录 1、简介1.1 whisper简介1.2 whisper模型 2、安装2.1 whisper2.2 pytorch2.3 ffmpeg 3、测试3.1 命令测试3.2 代码测试&#xff1a;识别声音文件3.3 代码测试&#xff1a;实时录音识别 4、工具4.1 WhisperDesktop4.2 Buzz4.3 Whisper-WebUI 结语 1、简介 https://gith…

Python 自动化之修理excel文件(二)

批量合成excel文档Pro版 文章目录 批量合成excel文档Pro版前言一、做成什么样子二、基本架构三、库输入模块四、用户输入模块五、数据处理模块1.获取当前目录的文件信息2.创建Workbook实例对象3.遍历entries列表4.获取Excel文件的工作表信息5.命名和写入数据 六、数据输出模块1…

ssm(springboot儿童众筹救助系统 儿童捐赠系统Java系统

ssm(springboot儿童众筹救助系统 儿童捐赠系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数…

[笔记] 使用 qemu/grub 模拟系统启动(多分区)

首先创建一块虚拟硬盘: dd bs512 count204800 if/dev/zero ofhd.img然后使用 losetup -f 将其关联为本地回环设备 losetup -f hd.img # 关联 hd.img 到空闲回环设备上 losetup -a /dev/loop0: [2080]:409 (/root/code/demo05/hd.img) # 查看刚刚关联到了哪里,这里关联到了 /d…

IEEE期刊论文模板

一、模板下载 1、登陆IEEE作者中心Author Center 地址&#xff1a;Publish with IEEE Journals - IEEE Author Center Journals 2、点击“Download a template” 3、在弹出的模板下载页面点击IEEE模板选择器“IEEE Template Selector” 4、在弹出的模板选择器页面点击“Tran…

分支预测失败的处理

由于现代的超标量处理器采用了很多预测的方法来执行指令,并不是流水线中所有的指令都可以退休(retire),例如当流水线中的某条分支指令发生了预测错误,或者某条指令发生了异常&#xff0c;那么在这条指令之后进入流水线的所有指令就不允许退休了&#xff1b; 此时需要将这些指令…