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

【C++设计模式】单一职责原则

2023年8月26日,周六上午


目录

  • 概述
  • 一个简单的例子
  • 用单一职责原则来设计一个简单的学生管理系统

概述

单一职责原则(Single Responsibility Principle,SRP),它是面向对象设计中的一个基本原则。

单一职责原则的核心思想是,一个类应该只有一个引起它变化的原因。

换句话说,一个类应该只负责一项功能或职责

这样做的好处是,当需求发生变化时,只有与该功能相关的类需要进行修改,而不会影响其他不相关的功能。


一个简单的例子

class FileManager {
public:void readFile(std::string filename) {// 读取文件的代码逻辑}void writeFile(std::string filename) {// 写入文件的代码逻辑}void deleteFile(std::string filename) {// 删除文件的代码逻辑}void encryptFile(std::string filename) {// 加密文件的代码逻辑}void compressFile(std::string filename) {// 压缩文件的代码逻辑}
};

在这个示例中,FileManager类负责文件的读取、写入、删除、加密和压缩等操作。

这个类违反了单一职责原则,因为它承担了多个不同的功能,即文件操作和文件处理。

为了遵循单一职责原则,我们可以将文件操作和文件处理分离为两个独立的类:

class FileManager {
public:void readFile(std::string filename) {// 读取文件的代码逻辑}void writeFile(std::string filename) {// 写入文件的代码逻辑}void deleteFile(std::string filename) {// 删除文件的代码逻辑}
};class FileProcessor {
public:void encryptFile(std::string filename) {// 加密文件的代码逻辑}void compressFile(std::string filename) {// 压缩文件的代码逻辑}
};

现在,FileManager类负责文件的基本操作,而FileProcessor类负责对文件进行加密和压缩等处理操作。这样,每个类都只有一个单一的职责,使得代码更加清晰、可维护和可扩展。

总结来说,单一职责原则要求将不同的职责分离到不同的类中,以确保每个类只负责一项功能。这样可以提高代码的可读性、可维护性和可扩展性,减少代码之间的耦合。


用单一职责原则来设计一个简单的学生管理系统

使用单一职责原则来设计一个简单的学生管理系统,可以将功能分解为以下几个类:

  1. Student类:表示学生对象,包含学生的基本信息(如姓名、学号、年龄)以及相关操作(如获取学生信息、修改学生信息)。
  2. StudentDatabase类:负责学生信息的存储和管理,包含增加学生、删除学生、查找学生等操作。
  3. StudentUI类:负责与用户交互,显示菜单选项,接收用户输入,并调用StudentDatabase类中的方法来执行相应的操作。
#include <iostream>
#include <vector>
#include <string>class Student {
private:std::string name;int studentId;int age;public:Student(std::string name, int studentId, int age): name(name), studentId(studentId), age(age) {}std::string getName() const {return name;}int getStudentId() const {return studentId;}int getAge() const {return age;}void updateName(std::string newName) {name = newName;}void updateAge(int newAge) {age = newAge;}
};class StudentDatabase {
private:std::vector<Student> students;public:void addStudent(const Student& student) {students.push_back(student);}void removeStudent(int studentId) {for (auto it = students.begin(); it != students.end(); ++it) {if (it->getStudentId() == studentId) {students.erase(it);break;}}}Student findStudent(int studentId) const {for (const auto& student : students) {if (student.getStudentId() == studentId) {return student;}}// 如果找不到对应的学生,则返回一个空的Student对象return Student("", -1, -1);}std::vector<Student> getAllStudents() const {return students;}
};class StudentUI {
private:StudentDatabase studentDB;public:void displayMenu() {std::cout << "=== 学生管理系统 ===" << std::endl;std::cout << "1. 添加学生" << std::endl;std::cout << "2. 删除学生" << std::endl;std::cout << "3. 查找学生" << std::endl;std::cout << "4. 显示所有学生" << std::endl;std::cout << "0. 退出" << std::endl;}void addStudent() {std::string name;int studentId, age;std::cout << "请输入学生姓名: ";std::cin >> name;std::cout << "请输入学生学号: ";std::cin >> studentId;std::cout << "请输入学生年龄: ";std::cin >> age;Student student(name, studentId, age);studentDB.addStudent(student);std::cout << "成功添加学生!" << std::endl;}void removeStudent() {int studentId;std::cout << "请输入要删除的学生学号: ";std::cin >> studentId;studentDB.removeStudent(studentId);std::cout << "成功删除学生!" << std::endl;}void findStudent() {int studentId;std::cout << "请输入要查找的学生学号: ";std::cin >> studentId;Student student = studentDB.findStudent(studentId);if (student.getStudentId() != -1) {std::cout << "找到学生: " << student.getName() << std::endl;std::cout << "学号: " << student.getStudentId() << std::endl;std::cout << "年龄: " << student.getAge() << std::endl;} else {std::cout << "未找到该学生!" << std::endl;}}void displayAllStudents() {std::vector<Student> students = studentDB.getAllStudents();if (students.empty()) {std::cout << "暂无学生信息!" << std::endl;} else {std::cout << "所有学生信息:" << std::endl;for (const auto& student : students) {std::cout << "姓名: " << student.getName() << ", ";std::cout << "学号: " << student.getStudentId() << ", ";std::cout << "年龄: " << student.getAge() << std::endl;}}}void run() {int choice;do {displayMenu();std::cout << "请输入选项: ";std::cin >> choice;switch (choice) {case 1:addStudent();break;case 2:removeStudent();break;case 3:findStudent();break;case 4:displayAllStudents();break;case 0:std::cout << "退出程序!" << std::endl;break;default:std::cout << "无效的选项,请重新输入!" << std::endl;}} while (choice != 0);}
};int main() {StudentUI studentUI;studentUI.run();return 0;
}

http://www.lryc.cn/news/149655.html

相关文章:

  • Windows docker desktop 基于HyperV的镜像文件迁移到D盘
  • LM-INFINITE: SIMPLE ON-THE-FLY LENGTH GENERALIZATION FOR LARGE LANGUAGE MODELS
  • ShardingSphere——压测实战
  • 二分图-染色法-dfs
  • SQL优化案例教程0基础(小白必看)
  • webpack(一)模块化
  • 基于Java+SpringBoot+Vue前后端分离人力资源管理系统设计和实现
  • 安装配置mariadb
  • Ant Design Vue 日期选择器DatePicker传给后台日期参数格式问题
  • springboot1.5.12升级至2.6.15
  • Android Event事件分发(新版本)
  • 可控生成:ControlNet原理
  • 【极客时间】MySQL 必知必会-20230901
  • 53 个 CSS 特效 3(完)
  • 简单数学题:找出最大的可达成数字
  • [C++ 网络协议] 套接字的多种可选项
  • 2022年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • ***数据转换中常用的两个函数 sscanf,sprintf
  • 软件工程(十九) 软件测试
  • go中读写锁(rwmutex)源码解读实现原理
  • 【人工智能】—_深度优先搜索、代价一致搜索、深度有限搜索、迭代深度优先搜索、图搜索
  • uni-app 客服按钮可上下拖动动
  • 基于Android的旅游管理系统 微信小程序
  • python-数据可视化-下载数据-CSV文件格式
  • 时序预测 | MATLAB实现SSA-XGBoost(麻雀算法优化极限梯度提升树)时间序列预测
  • leetcode 823 带因子的二叉树
  • 钉钉消息已读、未读咋实现的嘞?
  • Java 读取TIFF JPEG GIF PNG PDF
  • 研磨设计模式day14模板方法模式
  • 7 集群基本测试