设计模式六大原则(四)--接口隔离原则

ops/2024/9/20 7:24:18/ 标签: 接口隔离原则, 设计模式, 单一职责原则

1. 简介

1.1. 概述

接口隔离原则(Interface Segregation Principle,简称ISP)是设计模式六大原则之一,它指出在一个系统中,应该尽量将接口拆分成更小、更具体的接口,避免出现过大、过于臃肿的接口。这个原则强调了接口的设计应该尽可能地符合“单一职责”原则,即每个接口应该只负责一项职责。

接口隔离原则可以帮助我们设计出更加灵活、可扩展的系统。通过将接口拆分成更小的接口,我们可以更好地控制系统的复杂度,降低模块之间的耦合程度,提高代码的可维护性和可重用性。

1.2. 主要特点

  • 拆分接口:将一个大的接口拆分成多个小的接口,每个接口只负责一项职责。
  • 精确接口:接口中的方法应该尽可能地精确,只包含必要的方法,避免不必要的方法。
  • 多重继承:在某些编程语言中,可以使用多重继承来实现接口的拆分,使得一个类可以同时实现多个小的接口。
  • 抽象基类:在某些编程语言中,可以使用抽象基类来定义接口,并使用多重继承来实现接口的拆分。
  • 提高灵活性:通过将接口拆分成更小、更具体的接口,可以更好地控制系统的复杂度,降低模块之间的耦合程度,提高代码的可维护性和可重用性。

2. 优缺点

2.1. 优点

  • 提高灵活性:通过将接口拆分成更小、更具体的接口,可以更好地控制系统的复杂度,降低模块之间的耦合程度,提高代码的可维护性和可重用性。
  • 降低耦合:将接口拆分成更小的接口可以降低模块之间的耦合程度,使得模块之间的依赖关系更加清晰,有利于系统的扩展和维护。
  • 易于扩展:当需要添加新的功能时,可以根据需要添加新的接口,而不需要修改现有的接口,从而使得系统更容易扩展。

2.2. 缺点

  • 增加设计复杂度:将接口拆分成更小的接口可能会增加设计的复杂度,需要更多的设计工作和更多的接口类。
  • 可能增加代码冗余:将接口拆分成更小的接口可能会导致一些代码冗余,需要在多个接口类中实现相同的方法。
  • 可能影响性能:将接口拆分成更小的接口可能会对系统的性能产生一定的影响,需要在设计时权衡利弊。

3. 详细介绍

3.1. Java代码

下面是一个简单的Java代码示例,展示了如何利用多个小接口实现接口隔离原则

interface Shape {void draw();
}interface Circle extends Shape {void setRadius(int radius);
}interface Rectangle extends Shape {void setWidth(int width);void setHeight(int height);
}class CircleImpl implements Circle {private int radius;@Overridepublic void draw() {System.out.println("Drawing a circle.");}@Overridepublic void setRadius(int radius) {this.radius = radius;}
}class RectangleImpl implements Rectangle {private int width;private int height;@Overridepublic void draw() {System.out.println("Drawing a rectangle.");}@Overridepublic void setWidth(int width) {this.width = width;}@Overridepublic void setHeight(int height) {this.height = height;}
}public class InterfaceIsolationExample {public static void main(String[] args) {Circle circle = new CircleImpl();circle.setRadius(5);circle.draw(); // 输出:Drawing a circle.Rectangle rectangle = new RectangleImpl();rectangle.setWidth(10);rectangle.setHeight(20);rectangle.draw(); // 输出:Drawing a rectangle.}
}

在这个示例中,我们定义了三个接口Shape、Circle和Rectangle,其中Circle和Rectangle分别继承自Shape接口,并包含了各自特有的方法。接着,我们定义了两个实现类CircleImpl和RectangleImpl,它们分别实现了对应的接口,并提供了具体的方法实现。最后,在main方法中,我们创建了两个实现类对象,并通过接口类型的引用调用了它们的相应方法。这种方式实现了接口的隔离,使得各个接口只负责一项职责,提高了代码的可维护性和可重用性。

<


http://www.ppmy.cn/ops/97198.html

相关文章

C# Unity 面向对象补全计划 之 Switch 表达式(c# 8.0++)

前置知识&#xff1a;lambda表达式&#xff0c;枚举与Switch&#xff08;传统语法&#xff09;C# & Unity 面向对象补全计划 之 匿名函数与Lambda表达式-CSDN博客 C# 8.0引入了 switch 表达式&#xff0c;是一个语法糖&#xff08;类的属性get set就是一种语法糖&#xff0…

ubuntu 安装node

安装node 由于项目使用node 16.x开发&#xff0c;因此在Jenkins上&#xff0c;安装node 16.x 使用curl下载NodeSource的安装脚本&#xff1a; curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - 安装Node.js&#xff1a; sudo apt-get install -y nodejs验证…

[Day 59] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的共識算法優化 前言 區塊鏈作為一種顛覆性的分布式賬本技術,其核心在於共識機制的設計。不同的共識算法如比特幣的工作量證明(Proof of Work, PoW)、以太坊的權益證明(Proof of Stake, PoS)以及其他如授權證明(Proof of Authority, PoA)、委託權益證明(Delegated Proof…

杭州百腾教育科技 TiDB 6.5 to 7.5 升级记录

作者&#xff1a; reAsOn2010 原文来源&#xff1a; https://tidb.net/blog/612103f3 背景 使用 TiDB 作为我们的全量数据库已经有六七年了&#xff0c;当时还是 2.0 版本。早期TiDB的迭代和新特性的发布对于实际使用的影响还是很大的&#xff0c;所以从那个时候开始就有每…

Windows Server 2012 R2服务器安装CVE-2024-38077补丁KB5040456的安装及问题解决

Windows 远程桌面授权服务远程代码执行漏洞CVE-2024-38077&#xff0c;该漏洞影响: 远程执行代码&#xff0c;漏洞最高严重性: 严重。本文记录了Windows Server 2012 R2服务器补丁KB5040456的安装及报错“此更新不适用于你的计算机”的问题解决过程。 一、漏洞相关信息 1.影响…

「OC」探索CALayer:基础知识与实用技巧简要介绍

「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍 文章目录 「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍前言认识CALayerCALayer的相关属性 UIView和CALayer区别联系创建UIView和CALayer的原因 开始创建CALayer视图层级CALayers 和 Sublayersposition与…

鸿蒙HarmonyOS实战:IPC与RPC设备内进程通信

基本 IPC&#xff08;Inter-Process Communication&#xff09;与RPC&#xff08;Remote Procedure Call&#xff09;用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱动&#xff0c;用于设备内的跨进程通信&#xff0c;后者使用软总线驱动&#xff0c;用于跨设备跨进…

如何快速进入医疗器械维修行业

在当今医疗技术飞速发展的时代&#xff0c;医疗器械维修行业作为医疗服务的重要支撑&#xff0c;展现出了广阔的发展前景和就业机会。对于那些有志于进入这一领域的人来说&#xff0c;掌握正确的方法和途径至关重要。 首先&#xff0c;扎实的知识储备是进入医疗器械维修行业的…

以太网交换基础

1.以太网协议介绍 以太网是当今现有局域网&#xff08;Local Area Network, LAN&#xff09;采用的最通用的通信协议标准&#xff0c;该标准定义了在局域网中采用的电缆类型和信号处理方法。 冲突域 冲突域是指连接在同一共享介质上的所有节点的集合&#xff0c;冲突域内所有…

Graphpad Prism for Mac 医学绘图软件教程

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

数据库学习(进阶)

数据库学习&#xff08;进阶&#xff09; Mysql结构:连接层&#xff1a;服务层&#xff08;核心层&#xff09;&#xff1a;存储引擎层&#xff1a;系统文件层&#xff1a; 存储引擎&#xff08;概述&#xff09;:存储引擎特点&#xff1a;InnoDB存储引擎&#xff1a;(为并发条…

day23-测试自动化之Appium的滑动和拖拽事件、高级手势ActionChains、手机操作API

目录 一、滑动和拖拽事件 1.1.应用场景 1.2.swipe滑动事件 1.3.scroll滑动事件 1.4.drag_and_drop拖拽事件 1.5.滑动和拖拽事件的选择 二、高级手势ActionChains 2.1.应用场景 2.2.使用步骤 2.3.注意点 2.4.方法 1).手指轻敲操作 (掌握) 2).手势按下和抬起操作(掌握&#xff0…

响应式Web设计:纯HTML和CSS的实现技巧-1

响应式Web设计&#xff08;Responsive Web Design, RWD&#xff09;是一种旨在确保网站在不同设备和屏幕尺寸下都能良好运行的网页设计策略。通过纯HTML和CSS实现响应式设计&#xff0c;主要依赖于媒体查询&#xff08;Media Queries&#xff09;、灵活的布局、可伸缩的图片和字…

React 入门第一天:从Vue到React的初体验

作为一名合格的前端工程师&#xff0c;怎么能只会Vue呢&#xff1f;学习React不仅是一场新技术的探索&#xff0c;更是对前端开发思维的一次重新审视。在这里&#xff0c;我将分享学习React的心得&#xff0c;希望能帮助那些和我一样从Vue转向React的开发者。 1. 为什么选择Re…

playbook(剧本)基本应用、playbook常见语法、playbook和ansible操作的编排

playbook(剧本): 是ansible⽤于配置,部署,和管理被控节点的剧本。⽤ 于ansible操作的编排。 使⽤的格式为yaml格式 一、YMAL格式 以.yaml或.yml结尾 ⽂件的第⼀⾏以 "---"开始&#xff0c;表明YMAL⽂件的开始(可选的) 以#号开头为注释 列表中的所有成员都开始于…

思特科技案例:北京欢乐谷光影乐园

01      在北京欢乐谷的亲子领域&#xff0c;藏着一处“面积近400平米&#xff0c;炫酷堪比魔法世界的、美轮美奂的光影空间&#xff0c;做到了“让娃来了不想走&#xff0c;一玩就是一下午”。    思特科技案例&#xff1a;北京欢乐谷光影乐园      02      作…

STM32之SPI读写W25Q128芯片

SPI简介 STM32的SPI是一个串行外设接口。它允许STM32微控制器与其他设备&#xff08;如传感器、存储器等&#xff09;进行高速、全双工、同步的串行通信。通常包含SCLK&#xff08;串行时钟&#xff09;、MOSI&#xff08;主设备输出/从设备输入Master Output Slave Input&…

Godot关于fbx格式文件导入

查看文档fbx格式是支持&#xff0c;看我的文件也是存在&#xff0c;就是在编辑器中文件系统找不到。解决方案如下 确保你开启了fbx导入&#xff0c;之后自动重启就可以导入了&#xff0c;unity的模型也可以用。什么立方体胶囊之类的。

水利机械5G智能制造工厂物联数字孪生平台,推进制造业数字化转型

在当今这个科技日新月异的时代&#xff0c;水利机械行业正经历着一场深刻的变革&#xff0c;其中5G智能制造工厂物联数字孪生平台的引入&#xff0c;无疑是推动制造业数字化转型的重要驱动力。工业物联数字孪生平台是智能制造工厂的核心组成部分&#xff0c;它基于物理世界的真…

高性能日志系统 代理模式构建全局日志器获取接口

日志器获取接口 通过两个函数&#xff0c;用于获取指定名称的日志器和root日志器。两个函数分别通过调用loggerManager的getInstance方法&#xff0c;获取单例的日志管理器对象&#xff0c;通过这种方式&#xff0c;借助日志管理器获取具体的日志器对象。 设计的主要目的&…