C++设计模式:面向对象的八大设计原则之三

单一职责原则(Single Responsibility Principle,SRP)是面向对象设计中的一个重要原则,它强调一个类应该只有一个引起它变化的原因。简单来说,一个类应该只负责一项职责。如果一个类承担了过多的职责,那么当其中一个职责发生变化时,可能会影响到其他职责的正常运行,导致代码的可维护性和可扩展性变差。

下面通过一个具体的 C++ 代码示例来说明单一职责原则。

违反单一职责原则的示例

假设我们要实现一个简单的用户管理系统,这个系统需要处理用户信息的存储和用户信息的显示。如果我们将这两个职责都放在一个类中,代码可能如下:

cpp 复制代码
#include <iostream>

#include <vector>

#include <string>



// 违反单一职责原则的类

class UserManager {

private:

    std::vector<std::string> users;



public:

    // 存储用户信息

    void addUser(const std::string& user) {

        users.push_back(user);

        std::cout << "User " << user << " added successfully." << std::endl;

    }



    // 显示所有用户信息

    void displayUsers() {

        std::cout << "All users:" << std::endl;

        for (const auto& user : users) {

            std::cout << user << std::endl;

        }

    }

};



int main() {

    UserManager manager;

    manager.addUser("Alice");

    manager.addUser("Bob");

    manager.displayUsers();

    return 0;

}

在这个示例中,UserManager 类承担了两个职责:用户信息的存储和用户信息的显示。如果后续需要对用户信息的存储方式进行修改(例如,将用户信息存储到数据库中),或者对用户信息的显示格式进行修改(例如,添加一些额外的信息),都会直接影响到这个类。这就违反了单一职责原则,使得代码的可维护性和可扩展性变差。

遵循单一职责原则的示例

为了遵循单一职责原则,我们可以将用户信息的存储和用户信息的显示这两个职责分别放在不同的类中。代码如下:

cpp 复制代码
#include <iostream>

#include <vector>

#include <string>



// 用户信息存储类

class UserStorage {

private:

    std::vector<std::string> users;



public:

    // 存储用户信息

    void addUser(const std::string& user) {

        users.push_back(user);

        std::cout << "User " << user << " added successfully." << std::endl;

    }



    // 获取所有用户信息

    const std::vector<std::string>& getUsers() const {

        return users;

    }

};



// 用户信息显示类

class UserDisplay {

public:

    // 显示所有用户信息

    void displayUsers(const std::vector<std::string>& users) {

        std::cout << "All users:" << std::endl;

        for (const auto& user : users) {

            std::cout << user << std::endl;

        }

    }

};



int main() {

    UserStorage storage;

    storage.addUser("Alice");

    storage.addUser("Bob");



    UserDisplay display;

    display.displayUsers(storage.getUsers());



    return 0;

}    

在这个示例中,我们将用户信息的存储和用户信息的显示分别放在了 UserStorage 类和 UserDisplay 类中。这样,每个类只负责一项职责,当需要对用户信息的存储方式进行修改时,只需要修改 UserStorage 类;当需要对用户信息的显示格式进行修改时,只需要修改 UserDisplay 类。代码的可维护性和可扩展性得到了显著提高。

总结

单一职责原则可以帮助我们编写更加模块化、可维护和可扩展的代码。通过将不同的职责分离到不同的类中,我们可以降低代码的耦合度,使得每个类的功能更加清晰和独立。

相关推荐
嵌入式-老费5 分钟前
Easyx图形库应用(和lua结合使用)
开发语言·lua
AsiaLYF7 分钟前
kotlin中MutableStateFlow和MutableSharedFlow的区别是什么?
android·开发语言·kotlin
Asuncion00717 分钟前
Docker核心揭秘:轻量级虚拟化的革命
服务器·开发语言·docker·云原生
深思慎考1 小时前
RabbitMQ 入门:基于 AMQP-CPP 的 C++ 实践指南与二次封装
开发语言·c++·分布式·rabbitmq·api
深思慎考1 小时前
Ubuntu 系统 RabbitMQ 安装指南与使用(含 C++ 客户端与 SSL 错误解决)
c++·ubuntu·rabbitmq·github·rabbitmqpp
catchadmin1 小时前
PHP8.5 的新 URI 扩展
开发语言·后端·php
似水流年 光阴已逝1 小时前
从Excel姓名匹配案例学Python:由点及面的系统化学习指南
开发语言·python·excel
重生之我要当java大帝1 小时前
java微服务-尚医通-管理平台前端搭建-医院设置管理-4
java·开发语言·前端
Q_Q19632884752 小时前
python+vue的在线租房 房屋租赁系统
开发语言·vue.js·spring boot·python·django·flask·node.js
草莓熊Lotso2 小时前
《C++ Web 自动化测试实战:常用函数全解析与场景化应用指南》
前端·c++·python·dubbo