![现代C++软件架构:方法与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/127/48894127/b_48894127.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.7.4 接口隔离原则
接口隔离原则(ISP)就是像它的名字所暗示的那样。其表述如下:
不应该强迫客户端依赖它不使用的方法。
听起来它的意思很明显,但它有一些并不明显的含义。首先,应该倾向于选择更多更小的接口,而不是一个大的接口。其次,当添加派生类或扩展现有类的功能时,应该在扩展接口之前思考一下。
我们来展示一个违反此原则的示例,从以下接口开始:
![](https://epubservercos.yuewen.com/574F91/28606613407439306/epubprivate/OEBPS/Images/27_02.jpg?sign=1738843345-LxuI8jxCARMiIyl6o4scst2i7wdBjuiR-0-828f0389c303811634a2ec13c6fe1b0f)
我们用一个简单的类来实现它:
![](https://epubservercos.yuewen.com/574F91/28606613407439306/epubprivate/OEBPS/Images/27_03.jpg?sign=1738843345-xs2dd2TV5hg2AHzRECeGaVQJ6chw2FS1-0-2ecc6d561dcab4a1066e4d3cb76efb24)
到目前为止没有什么问题。现在,假设我们想建模另一个更先进的食品加工器(Anoth-erFoodProcessor类),在接口中添加更多的方法:
![](https://epubservercos.yuewen.com/574F91/28606613407439306/epubprivate/OEBPS/Images/28_01.jpg?sign=1738843345-p9DHohWhDDeey1F9M1eqOxGuIqvx6EWG-0-e92bbd85534951afafdcff76d24dd58d)
现在,搅拌机类Blender就有问题了,因为它不支持这个新的接口——没有适当的方式来实现它。我们可以尝试绕过这个问题或抛出std::logic_error,但更好的解决方案是将接口分成两个,每个接口都有单独的职责:
![](https://epubservercos.yuewen.com/574F91/28606613407439306/epubprivate/OEBPS/Images/28_02.jpg?sign=1738843345-KkBB6aMoN287g0SLHwtbFwoEK0zb6MBM-0-8ee0b8253e7792c223728a8b0b5f944b)
现在,我们的AnotherFoodProcessor类可以同时实现这两个接口,而且我们不需要改变现有的食品加工器(Blender类)的实现。
SOLID还剩最后一个原则,现在我们来介绍它。