用五中设计模式做学生管理系统并附上代码
时间: 2023-07-27 19:27:42 浏览: 96
好的,以下是一个简单的学生管理系统的代码,使用了五种设计模式:
1. 单例模式(Singleton Pattern):保证系统中只有一个学生管理系统实例。
2. 工厂模式(Factory Pattern):根据用户输入的指令创建不同的对象。
3. 观察者模式(Observer Pattern):当学生信息发生变化时,通知所有关注该学生的观察者。
4. 策略模式(Strategy Pattern):根据用户输入的指令选择不同的学生信息管理策略。
5. 模板方法模式(Template Method Pattern):定义一个抽象类,其中包含了一些通用的操作步骤,具体实现交给子类去完成。
```
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
// 学生类
class Student {
public:
Student(string name, int age, string id) : name_(name), age_(age), id_(id) {}
// 获取学生名字
string GetName() const {
return name_;
}
// 获取学生年龄
int GetAge() const {
return age_;
}
// 获取学生ID
string GetID() const {
return id_;
}
// 设置学生名字
void SetName(string name) {
name_ = name;
NotifyObservers();
}
// 设置学生年龄
void SetAge(int age) {
age_ = age;
NotifyObservers();
}
// 设置学生ID
void SetID(string id) {
id_ = id;
NotifyObservers();
}
// 添加观察者
void AddObserver(function<void()> observer) {
observers_.push_back(observer);
}
// 通知所有观察者
void NotifyObservers() {
for (auto observer : observers_) {
observer();
}
}
private:
string name_; // 学生名字
int age_; // 学生年龄
string id_; // 学生ID
vector<function<void()>> observers_; // 观察者列表
};
// 学生信息管理策略基类
class StudentInfoStrategy {
public:
virtual void UpdateInfo(Student& student) = 0; // 更新学生信息
};
// 学生名字管理策略
class StudentNameStrategy : public StudentInfoStrategy {
public:
void UpdateInfo(Student& student) override {
string name;
cout << "请输入学生名字:";
cin >> name;
student.SetName(name);
}
};
// 学生年龄管理策略
class StudentAgeStrategy : public StudentInfoStrategy {
public:
void UpdateInfo(Student& student) override {
int age;
cout << "请输入学生年龄:";
cin >> age;
student.SetAge(age);
}
};
// 学生ID管理策略
class StudentIDStrategy : public StudentInfoStrategy {
public:
void UpdateInfo(Student& student) override {
string id;
cout << "请输入学生ID:";
cin >> id;
student.SetID(id);
}
};
// 学生信息管理工厂
class StudentInfoFactory {
public:
static StudentInfoStrategy* GetStrategy(string type) {
if (type == "name") {
return new StudentNameStrategy;
} else if (type == "age") {
return new StudentAgeStrategy;
} else if (type == "id") {
return new StudentIDStrategy;
} else {
return nullptr;
}
}
};
// 学生管理系统类
class StudentManagementSystem {
public:
static StudentManagementSystem& GetInstance() {
static StudentManagementSystem instance;
return instance;
}
// 添加学生
void AddStudent(Student student) {
students_[student.GetID()] = student;
}
// 删除学生
void RemoveStudent(string id) {
students_.erase(id);
}
// 查找学生
Student* FindStudent(string id) {
auto iter = students_.find(id);
if (iter != students_.end()) {
return &(iter->second);
} else {
return nullptr;
}
}
// 更新学生信息
void UpdateStudentInfo(Student& student, string type) {
auto strategy = StudentInfoFactory::GetStrategy(type);
if (strategy) {
strategy->UpdateInfo(student);
delete strategy;
} else {
cout << "无效的操作类型!" << endl;
}
}
// 显示学生信息
void ShowStudentInfo(string id) {
auto student = FindStudent(id);
if (student) {
cout << "姓名:" << student->GetName() << endl;
cout << "年龄:" << student->GetAge() << endl;
cout << "ID:" << student->GetID() << endl;
} else {
cout << "找不到该学生!" << endl;
}
}
private:
map<string, Student> students_; // 学生列表
};
// 主函数
int main() {
auto& system = StudentManagementSystem::GetInstance();
// 添加学生
Student student1("张三", 18, "001");
Student student2("李四", 19, "002");
system.AddStudent(student1);
system.AddStudent(student2);
// 查找学生
string id;
cout << "请输入学生ID:";
cin >> id;
auto student = system.FindStudent(id);
if (student) {
cout << "找到了该学生!" << endl;
} else {
cout << "找不到该学生!" << endl;
}
// 显示学生信息
system.ShowStudentInfo(id);
// 更新学生信息
string type;
cout << "请输入要更新的信息类型(name/age/id):";
cin >> type;
system.UpdateStudentInfo(*student, type);
system.ShowStudentInfo(id);
// 删除学生
system.RemoveStudent(id);
return 0;
}
```