接口隔离原则理解和实践

        在软件开发中,设计原则是指导我们编写高质量代码的重要准则。接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计原则中的一条重要原则。ISP原则指出,客户端不应该依赖它不需要的接口,类间的依赖关系应该建立在最小的接口上。本文将详细解释接口隔离原则,并通过Java代码示例展示如何在实践中应用这一原则。

 

一、接口隔离原则的定义

        接口隔离原则的核心思想是,将庞大的接口拆分成更小、更具体的接口,使得客户端只需要知道它们感兴趣的方法。这样不仅可以减少系统的复杂性,还可以提高系统的灵活性和可维护性。

        ISP原则有以下几个关键点:

  1. 接口应该小而精:每个接口应该只包含客户端需要的方法,避免包含客户端不需要的方法。
  2. 客户端应该只依赖它需要的接口:客户端类不应该被迫依赖它们不需要的接口。
  3. 高内聚,低耦合:通过拆分接口,可以减少类之间的耦合度,提高系统的内聚性。

二、接口隔离原则的重要性

        接口隔离原则的重要性体现在以下几个方面:

  1. 降低系统复杂性:通过拆分接口,可以减少接口的复杂度,使得系统更加易于理解和维护。
  2. 提高系统的灵活性:当接口发生变化时,影响的范围会更小,因为客户端只依赖它们需要的接口。
  3. 增强系统的可维护性:当需要添加新功能时,可以更容易地通过添加新的接口来实现,而不需要修改现有的接口。

三、接口隔离原则的实践

        下面我们通过具体的Java代码示例来展示如何在实践中应用接口隔离原则。

示例背景

        假设我们有一个简单的系统,用于处理不同类型的动物。最初,我们有一个通用的Animal接口,包含所有动物共有的方法。然而,随着系统的扩展,我们发现不同类型的动物有不同的行为,比如鸟类会飞,鱼类会游泳,哺乳动物会跑。

初始设计(违反ISP原则)

// 初始的Animal接口
public interface Animal {
    void eat();
    void sleep();
    void fly();
    void swim();
    void run();
}

// 鸟类实现
public class Bird implements Animal {
    @Override
    public void eat() {
        System.out.println("Bird is eating.");
    }

    @Override
    public void sleep() {
        System.out.println("Bird is sleeping.");
    }

    @Override
    public void fly() {
        System.out.println("Bird is flying.");
    }

    @Override
    public void swim() {
        throw new UnsupportedOperationException("Bird cannot swim.");
    }

    @Override
    public void run() {
        throw new UnsupportedOperationException("Bird cannot run in this context.");
    }
}

// 鱼类实现
public class Fish implements Animal {
    @Override
    public void eat() {
        System.out.println("Fish is eating.");
    }

    @Override
    public void sleep() {
        System.out.println("Fish is sleeping.");
    }

    @Override
    public void fly() {
        throw new UnsupportedOperationException("Fish cannot fly.");
    }

    @Override
    public void swim() {
        System.out.println("Fish is swimming.");
    }

    @Override
    public void run() {
        throw new UnsupportedOperationException("Fish cannot run.");
    }
}

// 哺乳动物实现
public class Mammal implements Animal {
    @Override
    public void eat() {
        System.out.println("Mammal is eating.");
    }

    @Override
    public void sleep() {
        System.out.println("Mammal is sleeping.");
    }

    @Override
    public void fly() {
        throw new UnsupportedOperationException("Mammal cannot fly.");
    }

    @Override
    public void swim() {
        throw new UnsupportedOperationException("Mammal cannot swim in this context.");
    }

    @Override
    public void run() {
        System.out.println("Mammal is running.");
    }
}

        在上面的设计中,Animal接口包含了所有动物的行为方法,但并非所有动物都能实现这些方法。因此,某些实现类不得不抛出UnsupportedOperationException异常。这违反了接口隔离原则,因为客户端被迫依赖了它们不需要的方法。

改进设计(遵循ISP原则)

        为了遵循接口隔离原则,我们可以将Animal接口拆分成更小的接口,每个接口只包含特定类型动物的行为方法。

// 基本的Animal接口
public interface Animal {
    void eat();
    void sleep();
}

// 可飞行的接口
public interface Flyable {
    void fly();
}

// 可游泳的接口
public interface Swimmable {
    void swim();
}

// 可奔跑的接口
public interface Runnable {
    void run();
}

// 鸟类实现
public class Bird implements Animal, Flyable {
    @Override
    public void eat() {
        System.out.println("Bird is eating.");
    }

    @Override
    public void sleep() {
        System.out.println("Bird is sleeping.");
    }

    @Override
    public void fly() {
        System.out.println("Bird is flying.");
    }
}

// 鱼类实现
public class Fish implements Animal, Swimmable {
    @Override
    public void eat() {
        System.out.println("Fish is eating.");
    }

    @Override
    public void sleep() {
        System.out.println("Fish is sleeping.");
    }

    @Override
    public void swim() {
        System.out.println("Fish is swimming.");
    }
}

// 哺乳动物实现
public class Mammal implements Animal, Runnable {
    @Override
    public void eat() {
        System.out.println("Mammal is eating.");
    }

    @Override
    public void sleep() {
        System.out.println("Mammal is sleeping.");
    }

    @Override
    public void run() {
        System.out.println("Mammal is running.");
    }
}

        在改进后的设计中,我们定义了多个小接口,每个接口只包含特定类型动物的行为方法。这样,每个实现类只需要实现它们需要的接口,而不需要实现它们不需要的方法。这不仅提高了代码的可读性和可维护性,还减少了不必要的异常抛出。

总结

        接口隔离原则是面向对象设计中的重要原则之一,它强调将庞大的接口拆分成更小、更具体的接口,使得客户端只需要依赖它们需要的接口。通过遵循接口隔离原则,我们可以降低系统的复杂性,提高系统的灵活性和可维护性。

        在实践中,我们应该时刻关注接口的设计,确保每个接口都是小而精的,只包含客户端需要的方法。当发现接口变得过于庞大时,我们应该考虑将其拆分成更小的接口。同时,我们也应该关注实现类的设计,确保它们只实现它们需要的接口,避免不必要的依赖。

        通过不断实践接口隔离原则,我们可以编写出更加高质量、易于维护和扩展的代码,为系统的长期发展打下坚实的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL进阶——C++与SQL进阶实践

在C开发中,SQL数据库的操作是开发者常见的任务之一。虽然前面我们已经介绍了如何在C中通过数据库连接执行基本的SQL查询,但在实际项目中,我们通常需要更加复杂和高效的数据库操作。存储过程与函数的调用、复杂SQL查询的编写、以及动态构造SQL…

JVM 性能调优 -- JVM常用调优工具【jps、jstack、jmap、jstats 命令】

前言: 前面我们分析怎么去预估系统资源,怎么去设置 JVM 参数以及怎么去看 GC 日志,本篇我们分享一些常用的 JVM 调优工具,我们在进行 JVM 调优的时候,通常需要借助一些工具来对系统的进行相关分析,从而确定…

Mongo操作手册

Mongo数据类型 在Mongodb中,可以使用数字代码和别名作为过滤条件查询文档。在聚合操作中,可以获取字段类型的别名。或者根据返回的字段类型实现不同的逻辑。 //使用字符串"array"和数字类型4查询字段类型是数组的数据 db.collection.find({&l…

HBU深度学习作业9

1. 实现SRN (1)使用Numpy实现SRN import numpy as npinputs np.array([[1., 1.],[1., 1.],[2., 2.]]) # 初始化输入序列 print(inputs is , inputs)state_t np.zeros(2, ) # 初始化存储器 print(state_t is , state_t)w1, w2, w3, w4, w5, w6, w7, …

智能堆叠,集群和IRF

堆叠和IRF其实可以近似看成同一种技术,只是华三叫IRF,华为叫智能堆叠 智能堆叠(iStack):支持堆叠特性的交换机通过堆叠线缆连接在一起,从逻辑上变成一台交换设备,作为一个整体参与数据转发&…

三维渲染中顺序无关的半透明混合(OIT)(二——Stencil Route)

1、A-Buffer算法。 在谈到Stencil Route之前,需要先讨论A-Buffer算法。A-Buffer是一种图形学(渲染方向)上的用于可见面分析(Visble Surface Detection)的技术,是Z-Buffer的衍生方法。 Z-Buffer是用于剔除 不透明 物体的算法。假…

transformers bert-base-uncased情感分析

一、使用huggingface中的预训练模型,先要安装transformers、torch和SentencePiece pip install transformers pip install torch pip install SentencePiece 手动下载:https://huggingface.co/google-bert/bert-base-uncased/tree/main 添加以目录&…

Android开发仿qq详情下拉头像变大

Android开发仿qq详情下拉头像变大 个人详情界面,很多都有下拉头像变大的效果,其实我觉得这效果还不如点击头像看大图呢 一、思路: 自定义ScrollView 二、效果图: 看视频更直观点: Android开发教程案例分享-仿qq详情…

洛谷 P1157 组合的输出 C语言

题目:https://www.luogu.com.cn/problem/P1157#submit 题目描述 排列与组合是常用的数学方法,其中组合就是从 n 个元素中抽出 rr 个元素(不分顺序且 r≤nr≤n),我们可以简单地将 n 个元素理解为自然数 1,2,…,n从中任…

数据结构3.链表

目录 1.链表的概念及结构 2.链表的分类 1.单向或者双向 2.带头或者不带头 3.循环或者非循环 3.链表的实现 1.无头单向非循环链表 2.双向带头循环链表 4.顺序表和链表的区别 1.链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构&…

A054-基于Spring Boot的青年公寓服务平台

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

paimon的四种changelog模式(2)-none模式

# 请先了解input模式 环境创建 CREATE CATALOG fs_catalog WITH (typepaimon,warehousefile:/data/soft/paimon/catalog );USE CATALOG fs_catalog;drop table if exists t_changelog_none ;CREATE TABLE t_changelog_none (age BIGINT,money BIGINT,hh STRING,PRIMARY KEY (h…

【CSS in Depth 2 精译_064】10.3 CSS 中的容器查询相对单位 + 10.4 CSS 容器样式查询 + 10.5 本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 10.2.1 容器的类型10.2.2 容器的名称10.2.3 容器与模块化 CSS 10.3 与容器相关的单位 ✔…

CSS笔记(二)类名复用

这里我通过两张不同位置的卡片来实现效果 代码 <!DOCTYPE html> <html><head><style>/*设置画布*/body{/* 方便排列与对齐*/display: flex; /*画布布满整个窗口*/height: 100vh;/*水平居中*/justify-content: center;/*垂直居中*/align-items: cente…

常用函数的使用错题汇总

#include <iostream> #include <fstream> #include <string>int main() {std::ifstream fin("example.txt"); // 创建 ifstream 对象并打开文件// 检查文件是否成功打开if (!fin) {std::cerr << "Error opening file!" << s…

【树莓派5】移动热点获取树莓派IP并初次登录SSH

本篇文章包含的内容 1 打开系统热点2 烧录系统设置3 配置 MobaXterm4 初次启动树莓派配置选项4.1 换源4.2 更新软件包4.3 安装vim编辑器4.4 更改CPU FAN温度转速 Windows版本&#xff1a;Windows11 24H2树莓派&#xff1a;树莓派5&#xff0c;Raspberry Pi 5SSH软件&#xff1a…

分布式调用 - 服务间的远程调用RPC

文章目录 导图PreRPC 概述RPC 调用过程RPC 动态代理1. 接口定义 (SeverProvider)2. 实现类 (ServerProviderImpl)3. 动态代理类 (DynamicProxy)4. 客户端 (Client)5. 代码工作流程6. 总结和注意点7. 结果输出8. 小结 RPC 序列化1. JSON (JavaScript Object Notation)2. Hessian…

基于Matlab湍流对高斯光束传播影响的模拟与评估

随着光学通信与激光技术的不断发展&#xff0c;湍流对光束传播的影响已成为研究中的重要课题。特别是在大气湍流条件下&#xff0c;光束的传播会受到相位扰动的影响&#xff0c;从而导致光束质量的恶化、能量损失及光束中心的偏移等问题。本文基于高斯光束模型&#xff0c;提出…

19. C++STL 5(深入理解vector,vector的模拟实现,二维动态数组)

⭐本篇重点&#xff1a;vector深入理解和模拟实现 ⭐本篇代码&#xff1a;c学习/09.vector-2 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. 深入理解vector 二. 使用模板模拟实现vector &#xff08;包含迭代器&#xff09; 2.1 模拟vector类的成员…

PDF文件怎么加密?如何给pdf文档加密码保护?(2025全新科普)

PDF文件因其跨平台兼容性和格式稳定性&#xff0c;成为广泛使用的文档格式。 然而&#xff0c;随着信息泄露风险的增加&#xff0c;如何保护PDF文件的安全成为了一个重要问题。 本文将介绍几种2025年最新的PDF文件加密方法&#xff0c;帮助用户为PDF文档添加密码保护。 一、使…