![现代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=1738893318-m7pvvw8mfYGkttoUu6htoTHkSEVyRri9-0-0fec071227e4a1392e707a6bb1b7a870)
我们用一个简单的类来实现它:
![](https://epubservercos.yuewen.com/574F91/28606613407439306/epubprivate/OEBPS/Images/27_03.jpg?sign=1738893318-k9mh7GKH76OEpy0evdUX684XYAMsh1hb-0-0f9516cc26f07c73a561b4bcfb837c86)
到目前为止没有什么问题。现在,假设我们想建模另一个更先进的食品加工器(Anoth-erFoodProcessor类),在接口中添加更多的方法:
![](https://epubservercos.yuewen.com/574F91/28606613407439306/epubprivate/OEBPS/Images/28_01.jpg?sign=1738893318-Q8TMu7xMpkHoSgHhnlMNZ3dj3NBClEjY-0-4f6a3254013f8eea77ddd1280b9b7161)
现在,搅拌机类Blender就有问题了,因为它不支持这个新的接口——没有适当的方式来实现它。我们可以尝试绕过这个问题或抛出std::logic_error,但更好的解决方案是将接口分成两个,每个接口都有单独的职责:
![](https://epubservercos.yuewen.com/574F91/28606613407439306/epubprivate/OEBPS/Images/28_02.jpg?sign=1738893318-ch29Htpbl3hP4zBzELdziM5myF6nebck-0-1ed9bd86b45eaad9e12437f3176349f3)
现在,我们的AnotherFoodProcessor类可以同时实现这两个接口,而且我们不需要改变现有的食品加工器(Blender类)的实现。
SOLID还剩最后一个原则,现在我们来介绍它。