1. 原则定义
接口隔离原则(Interface Segregation Principle, ISP) 是SOLID原则中的"I",核心思想是:
客户端不应该被迫依赖它们不使用的接口
即:多个特定功能的接口比一个通用接口更好
2. 核心思想
- 将臃肿的接口拆分为更小、更具体的接口
- 客户端只需知道与它们相关的方法
- 减少接口之间的耦合
3. Python实现方式
Python通过ABC(抽象基类)实现接口隔离:
from abc import ABC, abstractmethod
# 违反ISP的设计
class IWorker(ABC):
@abstractmethod
def work(self): pass
@abstractmethod
def eat(self): pass # 不是所有worker都需要eat方法
# 遵循ISP的设计
class IWorkable(ABC):
@abstractmethod
def work(self): pass
class IEatable(ABC):
@abstractmethod
def eat(self): pass
class Worker(IWorkable, IEatable):
def work(self):
print("Working hard")
def eat(self):
print("Eating lunch")
class Robot(IWorkable): # 不需要实现eat方法
def work(self):
print("Working 24/7")
4. 典型应用场景
场景1:支付系统
# 不好的设计
class IPayment(ABC):
@abstractmethod
def pay_credit(self): pass
@abstractmethod
def pay_wechat(self): pass
# 好的设计
class ICreditPayment(ABC):
@abstractmethod
def pay_credit(self): pass
class IWechatPayment(ABC):
@abstractmethod
def pay_wechat(self): pass
场景2:文件处理
# 遵循ISP
class IReader(ABC):
@abstractmethod
def read(self): pass
class IWriter(ABC):
@abstractmethod
def write(self): pass
class FileProcessor(IReader, IWriter):
def read(self):
print("Reading file")
def write(self):
print("Writing file")
5. 最佳实践
-
识别角色:分析系统中有哪些不同的角色/职责
-
拆分接口:为每个角色创建专用接口
-
组合优于继承:通过多重继承组合小接口
-
鸭子类型:Python中可以利用鸭子类型实现隐式接口
# 不需要显式继承 class Logger: def log(self, message): print(f"LOG: {message}")
-
适度原则:避免过度拆分导致接口爆炸
6. 违反ISP的后果
- 客户端被迫实现不需要的方法
- 接口变更影响范围大
- 代码可读性和维护性降低
7. ISP与其他原则的关系
- 与单一职责原则(SRP)协同:SRP关注类职责,ISP关注接口职责
- 与依赖倒置原则(DIP)配合:共同实现松耦合设计
总结
在Python中应用ISP的关键是:
- 识别不同客户端的真实需求
- 通过小接口精确描述功能
- 使用组合/多重继承构建具体实现
- 充分利用Python的动态特性实现灵活设计