接口隔离原则,到底什么需要隔离?

news2025/1/7 5:33:37

接口隔离原则(Interface Segregation Principle, ISP)是SOLID五大设计原则之一,其核心思想是:客户端不应该被迫依赖于它不使用的方法;接口应当尽量小而专一,避免创建“胖”接口(即一个接口中定义了太多的方法)。

通过应用接口隔离原则,可以使系统更加灵活,维护性更高,并且减少类之间的耦合。

需要隔离的内容

  1. 方法:一个接口中不应包含过多的方法,特别是那些客户端不需要使用的方法。
  2. 实现:不同的接口实现应该针对特定的客户端需求,而不是一个通用的实现服务于所有客户端。
  3. 变化:接口的变化应该只影响到依赖于该接口的部分客户端,而不是所有客户端。

Java示例

假设我们设计一个系统,系统中有打印机(Printer)和复印机(Copier),同时也有一种设备是多功能一体机(MultiFunctionPrinter),即可以打印,也可以复印。

违反接口隔离原则的设计

// 胖接口
public interface Machine {
    void print();
    void copy();
}

public class Printer implements Machine {
    @Override
    public void print() {
        // 实现打印
        System.out.println("Printing document.");
    }

    @Override
    public void copy() {
        // 打印机不具备复印功能,但由于实现了Machine接口,这里必须提供空实现或抛出异常
        throw new UnsupportedOperationException("Copy not supported.");
    }
}

public class Copier implements Machine {
    @Override
    public void print() {
        // 复印机不具备打印功能,这里必须提供空实现或抛出异常
        throw new UnsupportedOperationException("Print not supported.");
    }

    @Override
    public void copy() {
        // 实现复印
        System.out.println("Copying document.");
    }
}

public class MultiFunctionPrinter implements Machine {
    @Override
    public void print() {
        System.out.println("Printing document.");
    }

    @Override
    public void copy() {
        System.out.println("Copying document.");
    }
}

在上面的设计中,PrinterCopier类被迫实现了它们不需要的方法,这违反了接口隔离原则。

符合接口隔离原则的设计

// 将接口拆分为更小的、专一的接口
public interface PrinterInterface {
    void print();
}

public interface CopierInterface {
    void copy();
}

// 单独实现打印功能的类
public class Printer implements PrinterInterface {
    @Override
    public void print() {
        System.out.println("Printing document.");
    }
}

// 单独实现复印功能的类
public class Copier implements CopierInterface {
    @Override
    public void copy() {
        System.out.println("Copying document.");
    }
}

// 实现多功能一体机,同时实现两个接口
public class MultiFunctionPrinter implements PrinterInterface, CopierInterface {
    @Override
    public void print() {
        System.out.println("Printing document.");
    }

    @Override
    public void copy() {
        System.out.println("Copying document.");
    }
}

在符合接口隔离原则的设计中,我们将Machine接口拆分为PrinterInterfaceCopierInterface,这样每个类只需关心它需要实现的功能。Printer类只实现打印接口,Copier类只实现复印接口,而MultiFunctionPrinter类则实现两个接口,从而提供了打印和复印功能。

好处

  1. 高内聚低耦合:每个接口都只负责一项职责,类之间的依赖关系更加明确。
  2. 灵活性增强:可以更容易地添加新功能或修改现有功能,而不会影响其他不相关的功能。
  3. 可维护性提高:当一个接口发生变化时,只需修改依赖于该接口的类,而不会影响其他类。

通过应用接口隔离原则,我们可以设计出更加清晰、灵活和可维护的系统。

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

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

相关文章

java项目之读书笔记共享平台(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 读书笔记共享平台的主要使…

git知识点汇总

git init 初始化一个git仓库,后面可以加仓库名,在当前目录下创建指定名称的目录并在该目录下创建仓库,若不加则直接在当前目录下创建仓库。git仓库的三个区域:工作区(当前目录)、暂存区(.git/in…

探索大型语言模型新架构:从 MoE 到 MoA

探索大型语言模型新架构:从 MoE 到 MoA 当前,商业科技公司纷纷投身于一场激烈的竞赛,不断扩大语言模型的规模,并为其注入海量的高质量数据,试图逐步提升模型的准确性。然而,这种看似顺理成章的发展路径逐渐…

单片机-静动态数码管实验

P0控制数码管 ,P0低电平 P1,P2,P3高电平 1、静态数码管 需求:数码管显示0,即让p0端口输出数字0的段码0x3f(共阴) #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; //数码管显示数字的数组 共阴极 …

Hyperbolic dynamics

http://www.scholarpedia.org/article/Hyperbolic_dynamics#:~:textAmong%20smooth%20dynamical%20systems%2C%20hyperbolic%20dynamics%20is%20characterized,semilocal%20or%20even%20global%20information%20about%20the%20dynamics. 什么是双曲动力系统? A hy…

细说STM32F407单片机轮询方式CAN通信

目录 一、项目介绍 二、项目配置 1、时钟、DEBUG、USART6、NVIC、GPIO、CodeGenerator 2、CAN1 (1)Bit Timings Parameters组,位时序参数 (2)Basic Parameters组,基本参数 (3&#xff09…

linux装git

前言 以 deepin 深度系统为例,安装命 令行版 Git 非常简单。 安装 注意:需要输入账号密码,否则无法进行。 打开终端,执行如下命令即可。 sudo apt-get install git成功 如下图所示,输入 git ,命令识别即…

微信小程序滑动解锁、滑动验证

微信小程序简单滑动解锁 效果 通过 movable-view (可移动的视图容器,在页面中可以拖拽滑动)实现的简单微信小程序滑动验证 movable-view 官方说明:https://developers.weixin.qq.com/miniprogram/dev/component/movable-view.ht…

Kerberos用户认证-数据安全-简单了解-230403

hadoop安全模式官方文档:https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html kerberos是什么 kerberos是计算机网络认证协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。 概念&#…

大麦抢票科技狠活

仅供学习参考,切勿再令您所爱的人耗费高昂的价格去购置黄牛票 ⚠️核心内容参考: 据悉,于购票环节,大麦凭借恶意流量清洗技术,于网络层实时甄别并阻拦凭借自动化手段发起下单请求的流量,强化对刷票脚本、刷票软件以及…

光伏电站的成本估算方式

绿虫仿真设计软件的成本估算功能主要通过以下方式实现: 依据设计方案自动生成材料清单:软件能够根据光伏项目的具体设计,确定所需的各种材料,如光伏组件、逆变器、线缆等。结合市场价格信息:它可以获取实时的市场价格…

结构生物学1-绪论:

请结合图片,详细解释图片中的内容,要求逻辑清晰,并给出整理与答疑1,x射线衍射: 1. X射线与光学显微镜的基本原理对比 X射线的特性:为了解析大约1-5埃(0.1-0.5纳米)的细小原子结构&…

yolo小damo合集

效果如下:这个是图片检测 效果如下:这个是视频检测 效果如下:这个是摄像头检测 1 相关库 除了yolov11所用库之外,本文所用到的额外库为pyqt5,输入指令进行安装 pip install pyqt5 导入所需要的库 import sys fro…

商标名称仅由常见姓氏构成,缺显驳回!

近日一个江苏网友给普推知产商标老杨发过来的一个商标驳回案例,商标驳回的原因与第一次驳回引证的商标居然是不一样的,引证的商标与第一次引证的商标也是不一样的。 看了下引证的两个商标与申请商标名称明显不太近似,或许还有做复审的机会&am…

Rockect基于Dledger的Broker主从同步原理

1.前言 此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写,有些不清楚的可以看下上一篇博客: RocketMQ原理简述(二)-CSDN博客 2.Broker的高可用 如果…

深入Android架构(从线程到AIDL)_08 认识Android的主线程

目录 3、 认识Android的主线程(又称UI线程) 复习: 各进程(Process)里的主线程​编辑 UI线程的责任: 迅速处理UI事件 举例 3、 认识Android的主线程(又称UI线程) 复习: 各进程(Process)里的主线程 UI线程的责任: 迅速处理UI事…

个人博客自我介绍

你好,我是Chiawei! 大家好,我是Chiawei,一个热爱编程和探索新知识的人。很高兴能在这里与大家分享我的编程之旅。今天,我想和大家聊聊我的自我介绍、编程目标、学习计划以及一些个人想法。 自我介绍 我是一个对技术充…

logback之自定义过滤器

logback有两种过滤器,一种是context中的过滤器叫TurboFilter,是一个全局的过滤器,会影响所有的日志记录。另一种是Appender中的过滤器,只对所在的append有效。两者大同小异,这里我们以Appender的过滤器为例。 &#x…

AcWing练习题:面积

给定三个浮点数 A,B 和 C。 然后,计算如下图形的面积: 底边为 A,高为 C 的三角形。半径 C 的圆。(π3.14159)底边为 A 和 B,高为 C 的梯形。边长为 B 的正方形。边长为 A 和 B 的长方形。 输…

三甲医院等级评审八维数据分析应用(一)--组织、制度、管理可视化篇

一、引言 1.1 研究背景与意义 在当今医疗领域,三甲医院作为医疗服务的核心载体,肩负着保障民众健康、推动医学进步的重任。随着信息技术的飞速发展,数据已成为医院运营管理、医疗质量提升以及科学决策的关键要素。三甲医院等级评审作为衡量医院综合实力与服务水平的重要标…