赞
踩
接口隔离原则(Interface Segregation Principle,简称 ISP)是设计模式中的一个原则,它规定客户端不应该依赖它不使用的方法。
换句话说,接口应该被细分为更小的、更具体的接口,以便客户端只依赖于它们需要的方法。
-
-
- (客户端)
- |
- V
- (公共行为) (特定行为) (特定行为)
- +------------+ +-------------+ +-------------+
- | I公共接口 | | I特定接口1 | | I特定接口2 |
- +------------+ +-------------+ +-------------+
- | | |
- V V V
- +-------+ +---------+ +---------+
- | 客户端1 | | 客户端2 | | 客户端3 |
- +-------+ +---------+ +---------+
接口应该被细分的足够少,接口与接口直接不应该有依赖,ISP 的目的是提高代码的灵活性、可维护性和可测试性。总结起来,ISP原则的好处和缺点如下。
ISP 的好处
ISP 的缺点
例如,以机器类的定义为例,假如一个机器可以打印机,复印机,发传真机,如果不加以深入思考,我们可能如下第一种方式定义。
bad 设计
- //
- // Created by Administrator on 2024/5/1.
- //
- #include <iostream>
- using namespace std;
- struct Document;
- struct IMachine{
- virtual void print(Document& doc) = 0;
- virtual void scan(Document& doc) = 0;
- virtual void fax(Document& doc) = 0;
-
- };
- // 接口分离原则
-
- // 发现 MFP 只需要 print 功能即可
- // 其他接口到底怎么处理比较好?
- struct MFP:IMachine{
- void print(Document &doc) override {
- // ok
- }
-
- void scan(Document &doc) override {
-
- }
-
- void fax(Document &doc) override {
-
- }
- };
-
- // 发现scanner 只需要 scan 功能
- // 其他接口到底怎么处理比较好?
- struct Scanner:IMachine{
- void print(Document &doc) override {
- // do what?
- }
-
- void scan(Document &doc) override {
- // ok
- }
-
- void fax(Document &doc) override {
- // do what?
- }
- };
如果后面的传真机怎么定义?,除了fax 函数外,其他函数的功能并不是fax 需要的。
好的设计
- #include <iostream>
- using namespace std;
- struct Document;
-
-
- // 接口分离
- struct IPrinter{
- virtual void print(Document& doc) =0 ;
- };
-
- struct IScanner {
- virtual void scan(Document& doc)=0 ;
- };
-
- struct IFax{
- virtual void fax(Document& doc)=0 ;
- };
-
- struct IMachine:IPrinter,IScanner {
-
- };
-
- struct Machine:IMachine{
- IPrinter& printer;
- IScanner& scanner;
- Machine(IPrinter &printer, IScanner &scanner):printer(printer),scanner(scanner){
-
- }
-
- void print(Document &doc) override {
- printer.print(doc);
- }
-
- void scan(Document &doc) override {
- scanner.scan(doc);
- }
- };
这种设计,我们可以任意进行组合,组合出不同特性的子类,自由度更高。
在实际开发中应用接口隔离原则(ISP)时,需要注意以下几点:
注意的具体示例:
应用 ISP 时,权衡其优点和缺点非常重要。ISP 可以提高代码的灵活性、可维护性和可测试性,但它也可能导致更多的接口和增加代码的复杂性。
总体而言,ISP 是一个有用的设计原则,它可以帮助提高代码的质量。通过遵循上述准则,开发人员可以有效地应用 ISP,从而获得其好处,同时避免其潜在的缺点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。