当前位置: 首页 > article >正文

SOLID原则学习,接口隔离原则

在这里插入图片描述

文章目录

  • 1. 定义
  • 2. 为什么要遵循接口隔离原则?
  • 3. 违反接口隔离原则的例子
  • 4. 遵循接口隔离原则的改进
  • 5. 总结


1. 定义

接口隔离原则(Interface Segregation Principle, ISP)
接口隔离原则是面向对象设计中的五大原则(SOLID)之一,由Robert C. Martin提出。其核心思想是:

客户端不应该依赖它们不需要的接口。

换句话说,一个类不应该被迫实现它不需要的方法。接口应该尽量细化,每个接口只负责一个特定的功能,而不是将所有功能都集中在一个庞大的接口中。


2. 为什么要遵循接口隔离原则?

1. 减少耦合:细化的接口可以减少类之间的依赖,降低耦合度。

2. 提高可维护性:当接口职责单一,修改一个接口不会影响到其他不相关的类。

3. 增强可读性:细化的接口更容易理解和维护。


3. 违反接口隔离原则的例子

假设我们有一个IMachine接口,定义了打印机、扫描仪和传真机的功能:

class IMachine {
public:
    virtual void print(const std::string& document) = 0;
    virtual void scan(const std::string& document) = 0;
    virtual void fax(const std::string& document) = 0;
};

然后我们有一个Printer类,它只需要实现打印功能:

class Printer : public IMachine {
public:
    void print(const std::string& document) override {
        // 实现打印功能
    }

    void scan(const std::string& document) override {
        // 打印机不需要扫描功能,但被迫实现
        throw std::runtime_error("Not implemented");
    }

    void fax(const std::string& document) override {
        // 打印机不需要传真功能,但被迫实现
        throw std::runtime_error("Not implemented");
    }
};

在这个例子中,Printer类被迫实现了scan和fax方法,尽管它并不需要这些功能。这违反了接口隔离原则。


4. 遵循接口隔离原则的改进

我们可以将IMachine接口拆分为多个更小的接口,每个接口只负责一个功能:

class IPrinter {
public:
    virtual void print(const std::string& document) = 0;
};

class IScanner {
public:
    virtual void scan(const std::string& document) = 0;
};

class IFax {
public:
    virtual void fax(const std::string& document) = 0;
};

然后,Printer类只需要实现IPrinter接口:

class Printer : public IPrinter {
public:
    void print(const std::string& document) override {
        // 实现打印功能
    }
};

如果有一个多功能设备,比如MultiFunctionMachine,它可以同时实现多个接口:

class MultiFunctionMachine : public IPrinter, public IScanner, public IFax {
public:
    void print(const std::string& document) override {
        // 实现打印功能
    }

    void scan(const std::string& document) override {
        // 实现扫描功能
    }

    void fax(const std::string& document) override {
        // 实现传真功能
    }
};

5. 总结

通过将庞大的接口拆分为多个小接口,我们可以确保每个类只实现它所需要的功能,避免了不必要的依赖和复杂性。这不仅提高了代码的可维护性,还使得系统更加灵活和可扩展。

关键点
1. 接口职责单一:每个接口只负责一个功能。

2. 避免强迫实现不需要的方法:类不应该被迫实现它不需要的方法。

3. 提高灵活性:细化的接口使得系统更容易扩展和修改。

遵循接口隔离原则可以帮助我们设计出更加清晰、灵活和可维护的系统。


http://www.kler.cn/a/488503.html

相关文章:

  • 使用docker-compose安装Redis的主从+哨兵模式
  • sql server cdc漏扫数据
  • MySQL - 子查询和相关子查询详解
  • 【马来西亚理工大学主办,ACM出版】2025年大数据、通信技术与计算机应用国际学术会议(BDCTA 2025)
  • CTF知识点总结(二)
  • leetcode 5. 最长回文子串
  • AI赋能服装零售:商品计划智能化,化危机为转机
  • SQL Server查询计划操作符——查询计划相关操作符(3)
  • 【HTML+CSS+JS+VUE】web前端教程-16-HTML5新增标签
  • C#Halcon找线封装
  • 关于地平线开发板使用nhwc格式的前向传播输出格式的理解
  • 【FlutterDart】tolyui_feedback组件例子效果(23 /100)
  • vue3 初体验
  • 学习通过几何约束从单个图像预测 3D 车道形状和相机姿态 | 论文解读
  • 前端哪些内容最好添加专属前缀?
  • 嵌入式系统 tensorflow
  • HarmonyOS开发:ArkTS初识
  • Windows使用AutoHotKey解决鼠标键连击现象(解决鼠标连击、单击变双击的故障)
  • package包机制详解
  • HTML实战课堂之倒计时页面
  • 如何使用Scala和Selenium爬取知乎视频并保存到本地
  • 分布式ID—雪花算法
  • 【python翻译软件V1.0】
  • 计算机毕业设计hadoop+spark+hive新能源汽车推荐系统 汽车数据分析可视化大屏 新能源汽车推荐系统 汽车爬虫 汽车大数据 机器学习
  • istio-proxy oom问题排查步骤
  • JVM 触发类加载的条件有哪些?