SOLID设计原则:接口隔离原则

简介: 本文探讨接口隔离原则(ISP),它是SOLID原则之一,强调不应强迫客户依赖不使用的方法。通过将接口拆分为多个具体接口,可以避免不必要的依赖,提高系统灵活性。接口隔离原则不同于单一职责原则,前者关注接口设计,后者关注类的职责划分。合理应用ISP可以提升代码质量,但在实践中需注意适度细化,避免过度设计。

你好,我是猿java。

通过前面的文章,SRP限制一个类的变化来源应该是单一的;OCP要求不要随意修改一个类;LSP则规范了类的继承关系。那么接口隔离原则会给我们带来什么惊喜呢? 今天我们就来聊一聊。

什么是接口隔离?

接口隔离原则,Interface segregation principle(ISP),也是 Robert C. Martin提出的 SOLID原则中的一种,老规矩,还是先看看作者 Robert C. Martin 对接口隔离原则是如何定义的:

Clients should not be forced to depend upon interfaces that they do not use.

在作者对接口隔离原则的定义中强调:不应强迫客户依赖他们不使用的接口。

在 Java中,我们一直都强调要面向接口编程,足以看出接口在 Java中的重要性。其实,
与单一职责原则类似,接口隔离原则的目标是通过将软件拆分为多个独立的部分来减少所需更改的副作用和频率。

这里的"不应强迫"该如何理解? 通常来讲"不应强迫" 有2种理解:

  1. 第一种理解是用户不能被强迫使用整个接口。
  2. 第二种理解是用户只使用接口中的部分方法,其余的方法不能被强迫使用。

显然,第二种理解比较合理,所以接口隔离原则可以更直白一点的表达成:在接口中,不要放置接口使用者不需要的方法。

站在接口使用者的角度,这样的设计更加人性化,为什么要增加一些我不需要的依赖负担呢?

如何实现接口隔离?

假如有一个业务场景,需要定义一个交通工具的 Transportation类,类中包含设置基本信息(价格,颜色),启停以及飞行等方法:

public interface Transportation{
   
    void setPrice(double price);
    void setColor(String color);
    void start();
    void stop();
    void fly();
}

汽车属于一种交通工具,因此我们可以定义一个 Car类去实现 Transportation类,代码如下:

public class Car implements Transportation {
   
    @Override
    public void setPrice(double price) {
   
       // 价格设置逻辑
    }
    @Override
    public void setColor(String color) {
   
        // 颜色设置逻辑
    }
    @Override
    public void start(){
   
        // 启动逻辑
    }
    @Override
    public void stop(){
   
        // 停止逻辑
    }
    @Override
    public void fly(){
   
        // 飞行逻辑
    }
}

从上面的代码可以发现一个问题:Car不能飞行却要实现 fly()方法,为什么? 显然 fly()这个方法是 Car这种交通工具不需要关注的,这就违反了接口隔离原则。

如何解决这个问题呢?

首先,我们将交通工具接口分成多个角色接口,每个角色接口用于特定的行为,在这里我们可以将 Transportation分成 BasicFeature、 Movable、Flyable 三类行为接口。

// 基本属性, 价格,颜色
public interface BasicFeature{
   
    void setPrice(double price);
    void setColor(String color);
}

// Movable 行为, 行驶和停止
public interface Movable {
   
    void start();
    void stop();
}

// 飞行 行为
public interface Flyable {
   
    void fly();
}

而 Car只需要关注基本属性和 Movable行为,代码如下:

public class Car implements BasicFeature, Movable {
   
    @Override
    public void setPrice(double price) {
   
        // 价格设置逻辑
    }
    @Override
    public void setColor(String color) {
   
        // 颜色设置逻辑
    }
    @Override
    public void start(){
   
        // 启动逻辑
    }
    @Override
    public void stop(){
   
        // 停止逻辑
    }
}

Airplane飞机需要关注基本属性,Movable行为和飞行行为,代码如下:

public class Airplane implements BasicCFeature, Movable, Flyable {
   
    @Override
    public void setPrice(double price) {
   
        // 价格设置逻辑
    }
    @Override
    public void setColor(String color) {
   
        // 颜色设置逻辑
    }
    @Override
    public void start(){
   
        // 启动逻辑
    }
    @Override
    public void stop(){
   
        // 停止逻辑
    }
    @Override
    public void fly(){
   
        // 飞行逻辑
    }
}

通过上面的拆解,我们可以看到每种交通工具只需要关注自己需要的接口就好了,自己不需要的接口就不会被强迫关注,更加不会造成 Car能 fly()这样不常见的误区。

接口隔离和单一职责的比较

接口隔离原则和单一职责原则都是 SOLID设计原则中的重要组成部分,虽然它们有一些相似之处,但它们关注的重点和应用的范围有所不同,在实际开发中,很容易搞混淆,因此,这里对这两个原则做详细比较。

  1. 关注点不同
    单一职责原则(SRP):关注类的职责划分,确保每个类只有为一类行为负责,它主要解决的是类内部职责过多导致的复杂性问题。
    接口隔离原则(ISP):关注接口的设计,确保客户端只依赖于它们实际需要的方法。它主要解决的是接口过于庞大导致的依赖问题。
  2. 作用范围不同
    单一职责原则(SRP):作用于类的设计和实现层面,通过分离职责提高类的内聚性。
    接口隔离原则(ISP):作用于接口的设计层面,通过细化接口减少客户端的依赖,提高系统的灵活性。
  3. 实现方法不同
    单一职责原则(SRP):通过将一个类的多种职责分离成多个独立的类来实现。
    接口隔离原则(ISP):通过将一个大接口分解为多个小接口,让不同的客户端依赖于不同的小接口来实现。

因此,接口隔离原则是在遵守单一职责原则的前提下,将接口更加细化。

总结

接口隔离可以提高代码的可读性、可维护性和灵活性,减少系统的耦合度,在实际开发中,合理应用接口隔离原则,可以帮助我们创建高质量的代码和系统。然而,在应用时需要注意适度细化和明确职责,避免过度设计和接口混乱。

学习交流

如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注:猿java,持续输出硬核文章。

目录
相关文章
|
4月前
|
数据采集 存储 JavaScript
Python实现网页内容转纯文本与EPUB电子书全攻略
本文介绍用Python自动化保存网页为TXT或EPUB电子书的完整方案:基于requests+BeautifulSoup抓取解析,ebooklib生成标准EPUB,支持正文智能提取、多章合并、图片保留与异常处理,兼顾实用性与合规性。(239字)
559 0
|
安全 Linux 测试技术
|
负载均衡 安全 网络虚拟化
|
7月前
|
运维 监控 算法
蓝牙信标人员定位系统:从技术原理、架构设计到实现方案详解(二)
本文详解蓝牙信标人员定位系统的实现方案,涵盖系统目标、四层架构设计(感知层、终端层、传输层、应用层)、核心定位算法(三角+指纹定位结合卡尔曼滤波)及关键实施步骤,包括前期准备、部署调试与优化,支持多场景定制与功能扩展。如果您想进一步了解人员定位的其他案例,欢迎关注、评论留言~也可搜索lbs智能定位。
|
7月前
|
传感器 算法 物联网
基于UWB和蓝牙信标的医院人员精准定位技术从原理到应用详解
本文介绍基于UWB与蓝牙Beacon的医院人员精准定位技术,融合物联网低功耗、智能感知优势,实现高精度实时定位。通过部署信标与基站,采集信号并结合自研算法解算位置,支持实时监测、智能预警、数据分析及视频联动,提升智慧医疗与疫情防控能力,助力医院智能化管理。
基于UWB和蓝牙信标的医院人员精准定位技术从原理到应用详解
|
5月前
|
人工智能 自然语言处理 安全
央视网x阿里云:基于通义打造智策大模型获2025年王选新闻科学技术奖一等奖
近日,中国新闻技术工作者联合会2025年学术年会暨“王选新闻科学技术奖”颁奖典礼在成都举行。由央视网与阿里云共同开发的传媒行业专属大模型——智策大模型,获本届“王选新闻科学技术奖”项目奖一等奖。 “王选新闻科学技术奖”是国内新闻传媒行业公认的最高级别科技奖项之一,项目奖每两年评审一次,旨在推动行业技术创新与应用变革。
339 3
|
6月前
|
存储 缓存 并行计算
LMCache:基于KV缓存复用的LLM推理优化方案
LMCache推出KV缓存持久化方案,显著优化大模型推理首Token延迟(TTFT)。通过将KV缓存存储至GPU、CPU或磁盘,实现跨请求复用,支持任意位置文本匹配,与vLLM深度集成,多轮对话、RAG场景提速3-10倍,降低硬件压力,提升吞吐。开源支持Linux/NVIDIA,正拓展AMD及更多生态支持。
865 15
LMCache:基于KV缓存复用的LLM推理优化方案
|
前端开发 JavaScript 测试技术
Google提出的网页性能评价指标
Google推出的“网页指标”计划旨在优化网页用户体验,其中Core Web Vitals为核心指标,包括Largest Contentful Paint (LCP)、Interaction to Next Paint (INP)和Cumulative Layout Shift (CLS),分别衡量加载速度、互动性和视觉稳定性。这些指标采用第75百分位数评估,确保在不同设备和网络环境下提供一致的用户体验。
988 5
Google提出的网页性能评价指标
|
供应链
DC电源模块的价格影响因素是什么?
DC电源模块是一种广泛应用于各种电子设备中用于提供稳定直流电源的电子器件。它通常由一组电子元件组成,包括电容、电阻、半导体器件和变压器等主要部件。它的价格因素受到许多因素的影响,包括材料、生产工艺、供应链、市场竞争等因素。如何进行成本优化是一项非常重要的任务,这有助于制造商提高竞争力和利润率。
 DC电源模块的价格影响因素是什么?
|
Linux 网络安全
Linux入门教程以及基础命令拿走点赞收藏
Linux入门教程以及基础命令拿走点赞收藏
331 1