2023年8月26日,周六上午
目錄
- 概述
- 一個簡單的例子
- 用單一職責(zé)原則來設(shè)計一個簡單的學(xué)生管理系統(tǒng)
概述
單一職責(zé)原則(Single Responsibility Principle,SRP),它是面向?qū)ο笤O(shè)計中的一個基本原則。
單一職責(zé)原則的核心思想是,一個類應(yīng)該只有一個引起它變化的原因。
換句話說,一個類應(yīng)該只負(fù)責(zé)一項功能或職責(zé)。
這樣做的好處是,當(dāng)需求發(fā)生變化時,只有與該功能相關(guān)的類需要進(jìn)行修改,而不會影響其他不相關(guān)的功能。
一個簡單的例子
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) {
// 壓縮文件的代碼邏輯
}
};
在這個示例中,F(xiàn)ileManager類負(fù)責(zé)文件的讀取、寫入、刪除、加密和壓縮等操作。
這個類違反了單一職責(zé)原則,因為它承擔(dān)了多個不同的功能,即文件操作和文件處理。
為了遵循單一職責(zé)原則,我們可以將文件操作和文件處理分離為兩個獨立的類:
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) {
// 壓縮文件的代碼邏輯
}
};
現(xiàn)在,F(xiàn)ileManager類負(fù)責(zé)文件的基本操作,而FileProcessor類負(fù)責(zé)對文件進(jìn)行加密和壓縮等處理操作。這樣,每個類都只有一個單一的職責(zé),使得代碼更加清晰、可維護(hù)和可擴(kuò)展。
總結(jié)來說,單一職責(zé)原則要求將不同的職責(zé)分離到不同的類中,以確保每個類只負(fù)責(zé)一項功能。這樣可以提高代碼的可讀性、可維護(hù)性和可擴(kuò)展性,減少代碼之間的耦合。文章來源:http://www.zghlxwxcb.cn/news/detail-679962.html
用單一職責(zé)原則來設(shè)計一個簡單的學(xué)生管理系統(tǒng)
使用單一職責(zé)原則來設(shè)計一個簡單的學(xué)生管理系統(tǒng),可以將功能分解為以下幾個類:文章來源地址http://www.zghlxwxcb.cn/news/detail-679962.html
- Student類:表示學(xué)生對象,包含學(xué)生的基本信息(如姓名、學(xué)號、年齡)以及相關(guān)操作(如獲取學(xué)生信息、修改學(xué)生信息)。
- StudentDatabase類:負(fù)責(zé)學(xué)生信息的存儲和管理,包含增加學(xué)生、刪除學(xué)生、查找學(xué)生等操作。
- StudentUI類:負(fù)責(zé)與用戶交互,顯示菜單選項,接收用戶輸入,并調(diào)用StudentDatabase類中的方法來執(zhí)行相應(yīng)的操作。
#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;
}
}
// 如果找不到對應(yīng)的學(xué)生,則返回一個空的Student對象
return Student("", -1, -1);
}
std::vector<Student> getAllStudents() const {
return students;
}
};
class StudentUI {
private:
StudentDatabase studentDB;
public:
void displayMenu() {
std::cout << "=== 學(xué)生管理系統(tǒng) ===" << std::endl;
std::cout << "1. 添加學(xué)生" << std::endl;
std::cout << "2. 刪除學(xué)生" << std::endl;
std::cout << "3. 查找學(xué)生" << std::endl;
std::cout << "4. 顯示所有學(xué)生" << std::endl;
std::cout << "0. 退出" << std::endl;
}
void addStudent() {
std::string name;
int studentId, age;
std::cout << "請輸入學(xué)生姓名: ";
std::cin >> name;
std::cout << "請輸入學(xué)生學(xué)號: ";
std::cin >> studentId;
std::cout << "請輸入學(xué)生年齡: ";
std::cin >> age;
Student student(name, studentId, age);
studentDB.addStudent(student);
std::cout << "成功添加學(xué)生!" << std::endl;
}
void removeStudent() {
int studentId;
std::cout << "請輸入要刪除的學(xué)生學(xué)號: ";
std::cin >> studentId;
studentDB.removeStudent(studentId);
std::cout << "成功刪除學(xué)生!" << std::endl;
}
void findStudent() {
int studentId;
std::cout << "請輸入要查找的學(xué)生學(xué)號: ";
std::cin >> studentId;
Student student = studentDB.findStudent(studentId);
if (student.getStudentId() != -1) {
std::cout << "找到學(xué)生: " << student.getName() << std::endl;
std::cout << "學(xué)號: " << student.getStudentId() << std::endl;
std::cout << "年齡: " << student.getAge() << std::endl;
} else {
std::cout << "未找到該學(xué)生!" << std::endl;
}
}
void displayAllStudents() {
std::vector<Student> students = studentDB.getAllStudents();
if (students.empty()) {
std::cout << "暫無學(xué)生信息!" << std::endl;
} else {
std::cout << "所有學(xué)生信息:" << std::endl;
for (const auto& student : students) {
std::cout << "姓名: " << student.getName() << ", ";
std::cout << "學(xué)號: " << 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;
}
到了這里,關(guān)于【C++設(shè)計模式】單一職責(zé)原則的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!