定义
接口分离原则(Interface Segregation Principle)用于处理胖接口(fat interface)所带来的问题。如果类的接口定义暴露了过多的行为,则说明这个类的接口定义内聚程度不够好。换句话说,类的接口可以被分解为多组功能函数的组合,每一组都服务于不同的客户类,而不同的客户类可以选择使用不同的功能分组。
简单来说,就是“客户端程序不应该依赖于它不需要的接口”。如果一个子类为了继承了父类,实现或者空载了父类很多方法,也就是父类一堆方法对它来说完全没用,那么这种情况就不符合接口分离原则。
案例
查资料的时候发现了有人已经实现了python案例,这里就直接用他的代码来解释
class Printer:
def print_text(self, text):
pass
def print_image(self, image):
pass
class LaserPrinter(Printer):
def print_text(self, text):
print("激光打印机打印文本:", text)
def print_image(self, image):
print("激光打印机不支持打印图片")
在这个传统的设计中,LaserPrinter
类实现了整个Printer
接口,包括打印文本和打印图片两个方法。然而,LaserPrinter
并不支持打印图片,因此print_image()
方法只是一个空实现。这样的设计使得LaserPrinter
类依赖了它不需要的接口,增加了代码的冗余和复杂性。
而符合接口隔离原则的设计方式是将接口拆分为多个小接口:
class TextPrinter:
def print_text(self, text):
pass
class ImagePrinter:
def print_image(self, image):
pass
class LaserPrinter(TextPrinter):
def print_text(self, text):
print("激光打印机打印文本:", text)
这个设计中,我们将打印机接口拆分为了两个小接口TextPrinter
和ImagePrinter
,LaserPrinter
类只实现了TextPrinter
接口,这样就避免了它依赖不需要的接口。
这样的设计使得接口更加精简和专注,提高了代码的灵活性和可维护性。当我们需要一个只打印文本的打印机时,可以直接使用LaserPrinter
类,而不需要担心它会有无用的接口。
参考
接口分离原则(Interface Segregation Principle) - sangmado - 博客园
接口隔离原则 (Interface Segregation Principle) - 知乎
面向对象编程的六大原则
文章评论