当前位置: 首页 > news >正文

接口隔离原则(ISP)

非常好,**接口隔离原则(ISP: Interface Segregation Principle)是 SOLID 五大原则中的第四个,它专门解决“一个接口太臃肿”**导致的麻烦。

我来从以下几个维度详细拆解:


🧠 什么是接口隔离原则?

客户端不应该被强迫依赖它不使用的方法。

也就是说:

  • 接口(或抽象类)应该小而精
  • 不要让一个类必须实现一堆它根本用不到的方法。

❌ 举个日常反例(更容易懂)

你去 ATM 机,只是想取钱
但 ATM 接口强迫你必须实现:

def transfer_money()
def pay_credit_card()
def change_pin()
def open_account()  # ❌

—— 你并不需要这些,但你被迫要实现它们,这就违反了接口隔离原则。


✅ 为什么需要接口隔离原则?

问题接口隔离带来的好处
接口太大,导致子类实现麻烦✅ 子类只依赖自己需要的方法
改动一个接口方法,很多子类都受影响✅ 修改影响范围变小(高内聚)
测试复杂、维护困难✅ 测试更聚焦、职责更清晰

✅ 优点 vs ❌ 缺点

优点缺点
高内聚、低耦合接口数量变多
职责清晰抽象类设计更复杂
子类不再实现无关方法初学者觉得“麻烦”

🐍 Python 示例

❌ 违反接口隔离原则

from abc import ABC, abstractmethod# 一个臃肿的“多功能接口”
class Machine(ABC):@abstractmethoddef print(self): pass@abstractmethoddef fax(self): pass@abstractmethoddef scan(self): pass# 简单打印机,只能 print,却被迫实现 fax、scan
class SimplePrinter(Machine):def print(self):print("Printing...")def fax(self):raise NotImplementedError("I can't fax")def scan(self):raise NotImplementedError("I can't scan")

😰 这个子类为了继承,只能抛出异常,尴尬。


✅ 遵守接口隔离原则

from abc import ABC, abstractmethod# 将大接口拆分为多个小接口
class Printer(ABC):@abstractmethoddef print(self): passclass Scanner(ABC):@abstractmethoddef scan(self): passclass Fax(ABC):@abstractmethoddef fax(self): pass# 只需要打印功能的类,只实现 Printer 接口
class SimplePrinter(Printer):def print(self):print("Printing...")# 多功能机实现多个接口
class MultiFunctionPrinter(Printer, Scanner, Fax):def print(self): print("Printing...")def scan(self): print("Scanning...")def fax(self): print("Faxing...")

✅ 各司其职,接口清晰。


🧭 清晰结构图(Mermaid)

Printer
+print()
Scanner
+scan()
Fax
+fax()
SimplePrinter
+print()
MultiFunctionPrinter
+print()
+scan()
+fax()

🏁 总结口诀:

❌ 一个接口塞太多方法 → 所有人都被迫实现 → 违反 ISP
✅ 把大接口拆小、按需组合 → 谁用啥就实现啥 → 遵守 ISP


📌 应用场景

  • 微服务接口暴露:每个服务只暴露自己的职责方法
  • 多能力设备:按能力接口组合(打印/扫描/发邮件)
  • 用户权限系统:不同角色使用不同接口,不强制统一

如果你想,我还可以用实际项目比如“支付接口”、“用户角色接口”等真实场景帮你模拟设计一套 ISP 系统,要试试看吗?👨‍💻

相关文章:

  • 动态规划之多状态问题1
  • LeetCode - 19.删除链表的倒数第N个结点
  • 第十四篇:系统分析师第三遍——15章
  • 强化学习:山地车问题
  • 什么是“原子变量”?
  • 在多线程环境下如何设计共享数据结构保证原子操作与数据一致性
  • 解决奥壹oelove婚恋原生小程序上架问题,彻底解决解对问题增强版旗舰版通用
  • Ubuntu 24.04 通过 update-alternatives 切换GCC版本
  • PowerShell从5.1升级到7.X
  • C++类_运算符的重载
  • 线性DP(动态规划)
  • flask 获取各种请求数据:GET form-data x-www-form-urlencoded JSON headers 上传文件
  • 物联网智能项目之——智能家居项目的实现!
  • 开源项目实战学习之YOLO11:ultralytics-cfg-models-rtdetr(十一)
  • 循环缓冲区
  • 实验-组合电路设计1-全加器和加法器(数字逻辑)
  • 大数据:驱动技术创新与产业转型的引擎
  • 节流 和 防抖的使用
  • 【C语言练习】018. 定义和初始化结构体
  • ai之paddleOCR 识别PDF python312和paddle版本冲突 GLIBCXX_3.4.30
  • 潘功胜发布会答问五大要点:除了降准降息,这些政策“含金量”也很高
  • 李云泽:支持小微企业、民企融资一揽子政策将从增供给、降成本、提效率、优环境4个方面发力
  • 应对美政策调整:中国重在开放与创新,维护好数据主权
  • 五一假期上海边检查验出入境人员超61万人次,同比增长23%
  • 商务部:自5月7日起对原产于印度的进口氯氰菊酯征收反倾销税
  • 体坛联播|拜仁提前2轮德甲夺冠,赵心童11比6暂时领先