14、跟学23种设计模式(C++版):单一职责模式

单一职责原则(Single Responsibility Principle, SRP)是面向对象设计的一个基本原则。它的核心思想是一个类只应该有一个引起它变化的原因,也就是说,一个类只负责一个职责。遵循单一职责原则可以提高系统的可维护性和可扩展性。

模式特点

  • 职责单一:每个类只负责一个功能领域中的单一职责。
  • 高内聚:类的内部功能是高度相关和紧密联系的。
  • 低耦合:不同的类之间的依赖关系减少,修改一个类不会影响到其他类。
  • 易于维护:由于类的职责单一,代码更容易理解、调试和修改。
  • 增强复用性:职责单一的类更容易在其他项目中复用。

适用场景

  • 代码重构:当一个类变得过于复杂,承担了过多的职责时,可以应用SRP将其拆分。
  • 模块化开发:在设计系统时,确保每个模块(类)只承担一个职责。
  • 维护和扩展:当需要对系统进行维护和扩展时,SRP有助于快速定位和修改代码。
  • 测试驱动开发:职责单一的类更容易进行单元测试。

C++案例

假设我们有一个简单的日志记录系统,初始实现中,一个类既负责日志的记录,也负责日志的输出。我们可以通过单一职责原则将其拆分为两个类。


#include <iostream>
#include <fstream>
#include <string>

class Logger {
public:
    void Log(const std::string& message) {
        std::ofstream file("log.txt", std::ios::app);
        if (file.is_open()) {
            file << message << std::endl;
            file.close();
        }
        std::cout << message << std::endl;
    }
};

应用单一职责原则后的实现


#include <iostream>
#include <fstream>
#include <string>

// 负责日志记录的类
class LogWriter {
public:
    void WriteToFile(const std::string& message) {
        std::ofstream file("log.txt", std::ios::app);
        if (file.is_open()) {
            file << message << std::endl;
            file.close();
        }
    }
};

// 负责日志输出的类
class LogOutput {
public:
    void PrintToConsole(const std::string& message) {
        std::cout << message << std::endl;
    }
};

// 负责日志操作的类
class Logger {
public:
    Logger(LogWriter& writer, LogOutput& output)
        : writer_(writer), output_(output) {}

    void Log(const std::string& message) {
        writer_.WriteToFile(message);
        output_.PrintToConsole(message);
    }

private:
    LogWriter& writer_;
    LogOutput& output_;
};

在这个例子中,原来的Logger类既负责将日志写入文件,也负责将日志输出到控制台。通过应用单一职责原则,我们将其拆分为三个类:LogWriter负责将日志写入文件,LogOutput负责将日志输出到控制台,而Logger类则负责协调这两个类的工作。这样,每个类都只有一个职责,代码的内聚性和可维护性都得到了提高。

*

总结

单一职责原则是面向对象设计的重要原则之一。通过将不同的职责分离到不同的类中,可以提高代码的内聚性,降低类之间的耦合性,使代码更容易理解、维护和扩展。在实际开发中,遵循单一职责原则可以提高代码质量,减少维护成本,增强系统的灵活性和可扩展性。

END

今天是日更的第25/100天

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: