SOLID - 接口隔离原则(Interface Segregation Principle)

ops/2024/10/30 3:47:38/

SOLID - 接口隔离原则(Interface Segregation Principle)

Interface Segregation Principle

定义

接口隔离原则(Interface Segregation Principle,ISP)是面向对象设计中的五个基本原则之一,通常缩写为SOLID中的I。这一原则由Robert C. Martin提出,旨在通过将接口进行分离,避免接口被过多的方法所污染。ISP的核心思想是:

Many client specific interfaces are better than one general purpose interface

可以理解为,特定于客户端的接口要好于一个通用接口。每个接口只包含客户端真正需要的方法,避免使用者被迫实现不需要的方法。这一原则有助于减少接口的复杂性,使系统更符合单一职责原则(SRP),并提高代码的可扩展性和可维护性。

使用情境

接口隔离原则通常应用在以下情境中:

  1. 大型项目:当项目包含多个功能模块,每个模块的功能需求有所不同。

  2. 多样化客户端:当有多个不同类型的客户端(例如移动端、Web端)时,不同的客户端需要不同的方法集。

  3. 延迟耦合:通过接口隔离,可以减少不同模块之间的依赖,从而实现松耦合。

示例代码

以下是一个不遵循接口隔离原则的Java代码示例:

public interface IWorker {void work();void eat();
}public class Worker implements IWorker {@Overridepublic void work() {System.out.println("Working...");}@Overridepublic void eat() {System.out.println("Eating...");}
}public class Robot implements IWorker {@Overridepublic void work() {System.out.println("Working...");}@Overridepublic void eat() {// Robots don't eat!throw new UnsupportedOperationException("Robots don't eat!");}
}

在上述代码中,Robot类被迫实现IWorker接口中的eat方法,即使机器人不需要这个方法。

下面是遵循接口隔离原则的代码:

public interface IWorkable {void work();
}public interface IFeedable {void eat();
}public class Worker implements IWorkable, IFeedable {@Overridepublic void work() {System.out.println("Working...");}@Overridepublic void eat() {System.out.println("Eating...");}
}public class Robot implements IWorkable {@Overridepublic void work() {System.out.println("Working...");}
}

在这个设计中,我们将IWorker接口拆分成了IWorkableIFeedable两个小接口。这使得Robot类只需要实现它真正需要的work方法。

在云原生编程中的应用

not-enough-for-code-to-work

在云原生编程中,接口隔离原则同样适用,并且被赋予了新的意义,就是说,不要给你的客户端提供他们不需要的部分。

Don’t show your clients more than they need to see.

以下是一些具体的应用场景:

设计独立的微服务接口

在微服务架构中,每个微服务通常负责特定的业务功能。遵循接口隔离原则,可以为每个微服务设计独立且专一的接口,以满足不同的业务需求。这种设计有助于微服务的独立开发、测试和部署。举例来说,假设我们有一个订单管理系统,可以将其拆分为多个微服务,每个微服务有自己专用的接口,避免了过于庞大的接口带来的复杂性问题。

public interface OrderCreationService {void createOrder(Order order);
}public interface OrderQueryService {Order getOrderById(String orderId);
}public interface OrderCancellationService {void cancelOrder(String orderId);
}

接口版本化

在微服务架构中,不同客户端可能需要不同版本的服务接口。通过接口隔离原则,可以为每个版本创建独立的接口,确保不同版本之间的独立性,避免版本升级时的兼容性问题。

public interface OrderServiceV1 {void createOrder(Order order);Order getOrderById(String orderId);
}public interface OrderServiceV2 {void createOrder(Order order);Order getOrderById(String orderId);void updateOrder(Order order);
}

这样,当需要提供新功能(例如在V2版本增加更新订单功能)时,可以保持旧版本接口的不变,从而确保向后兼容。

API 网关

API 网关作为进入系统的统一入口,可以根据不同客户端的需求,提供不同的定制化API接口。这符合接口隔离原则的精神——多个特定于客户端的接口要好于一个通用接口。例如,可以为移动客户端和Web客户端分别创建不同的接口,以适应它们的不同需求,通过这种方式,可以为不同的客户端提供最佳的API使用体验。

public interface MobileOrderAPI {void createOrder(Order order);Order getOrderById(String orderId);
}public interface WebOrderAPI {void createOrder(Order order);Order getOrderById(String orderId);void cancelOrder(String orderId);
}

总结

接口隔离原则是创建高效、维护良好的面向对象系统的重要原则之一。在云原生编程中,遵循这一原则可以设计出更加灵活、可扩展的微服务系统。通过识别不同客户端的需求,创建小而专用的接口,并将服务模块化,能够显著提高系统的可维护性和灵活性。接口隔离原则不仅适用于传统的面向对象编程,同样也适用于现代的云原生架构设计,是确保系统稳定性、可扩展性及高效性的重要设计指南。

关于SOLID设计原则的总体描述,请参考:软件设计还是要SOLID!


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

相关文章

[Control-Chaos] Toxic Cascade(毒性级联) 机械工程图纸逆向+化学工业计算+信息收集

Toxic Cascade https://github.com/MartinxMax/Control-Chaos 推荐人数: 1 部署 将 ./web/ 复制到 web 服务器中。 访问任务面板&#xff0c;网址为 http://<IP>。 在 ./target/reset.py 中&#xff0c;设置 DingTalk 机器人 TOKEN 和签名&#xff08;用于监测选手是否…

技术成神之路:设计模式(二十一)外观模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口&#xff0c;使得子系统更容易使用。 …

HarmonyOS NEXT: 抓住机遇,博

鸿蒙生态崛起&#xff1a;开发者如何抓住机遇&#xff0c;创造卓越应用体验 鸿蒙系统的崛起与优势开发者面临的机遇与挑战解决方案与前景分析开发人员学习路径 在移动操作系统领域&#xff0c;安卓&#xff08;Android&#xff09;和苹果iOS系统长期占据主导地位。然而&#xf…

【移动应用开发】Android持久化技术

目录 一、实现一个“我的图书馆” 1. 用户登陆界面 1.1 运行截图 1.2 源代码 ① 布局文件activity_login.xml ② res/values/strings.xml ③ LoginActivity.kt ④ 在AndroidManifest.xml注册LoginActivity.kt 2. 图书信息数据库和显示界面 2.1 功能实现截图 2.2 源…

adguard home去广告

使用adguard来去广告 在OpenWRT路由器上安装并使用Adguardhome以过滤广告|晓旭Blog (xiaoxu.net) https://223.5.5.5/dns-query https://1.12.12.12/dns-query https://120.53.53.53/dns-query https://1.1.1.1/dns-query https://doh.pub/dns-query https://dns.alidns.com/d…

leetcode-146. LRU 缓存

题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;…

oracle数据库---PL/SQL、存储函数、存储过程、触发器、定时器job、备份

PL/SQL 什么是 PL/SQL PL/SQL&#xff08;Procedure Language/SQL&#xff09;是 Oracle 对 sql 语言的过程化扩展&#xff0c;指在 SQL 命令语言中增加了过程处理语句&#xff08;如分支、循环等&#xff09;&#xff0c;使 SQL 语言具有过程处理能力。把SQL语言的数据操纵能…

三防加固工业平板国产化的现状与展望

在当今全球科技竞争日益激烈的背景下&#xff0c;工业4.0和智能制造的浪潮推动了工业自动化设备的迅速发展&#xff0c;其中&#xff0c;三防加固工业平板电脑作为连接物理世界与数字世界的桥梁&#xff0c;其重要性不言而喻。所谓“三防”&#xff0c;即防水、防尘、防震&…