设计模式——MVC模式
定义与概念
MVC(Model - View - Controller)模式是一种软件架构模式。它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这三个部分相互协作,使得应用程序的设计更加模块化、易于维护和扩展。
- 模型(Model):
它是应用程序中用于处理数据逻辑的部分。模型负责管理数据,包括数据的存储、检索和更新等操作。例如,在一个学生管理系统中,学生信息(如姓名、学号、成绩等)的存储和处理(如添加学生、修改成绩等)就是模型的职责范围。模型不关心数据是如何展示给用户的,也不关心用户如何与数据进行交互。 - 视图(View):
视图主要负责将模型中的数据以某种形式展示给用户。它可以是图形界面(如 Windows 应用程序的窗口、网页中的 HTML 页面),也可以是文本形式(如命令行界面的输出)。视图通常只是从模型获取数据并进行展示,不会直接修改数据。在学生管理系统中,视图可以是一个显示学生列表的表格或者是一个展示学生详细信息的表单。 - 控制器(Controller):
控制器作为模型和视图之间的桥梁,用于处理用户的输入和操作。它接收用户在视图上的操作(如点击按钮、输入文本等),并根据这些操作来调用模型中的相应方法,以更新数据或者获取新的数据。然后,控制器会通知视图进行相应的更新,以反映模型的变化。在学生管理系统中,当用户点击 “添加学生” 按钮时,控制器会接收这个操作,调用模型中的添加学生方法,然后让视图更新显示新的学生列表。
工作原理
- 用户操作与视图:
用户在视图层进行操作,如在网页上点击一个链接或者在桌面应用程序中按下一个按钮。这些操作会被视图发送给控制器。 - 控制器处理操作:
控制器接收到视图传来的用户操作后,会解析这个操作,确定需要调用模型中的哪些方法来处理。例如,如果用户在学生管理系统的视图中输入了一个新学生的信息并点击 “添加” 按钮,控制器会调用模型中的添加学生方法,将新学生的信息存储到数据库或者数据结构中。 - 模型更新与反馈:
模型完成数据处理后(如成功添加学生信息),会将处理结果(如返回新的学生列表或者添加成功的提示信息)反馈给控制器。 - 控制器通知视图更新:
控制器收到模型的反馈后,会通知视图进行更新。视图根据控制器的通知,从模型获取最新的数据,并更新自身的显示内容。例如,在学生管理系统中,视图会重新获取学生列表并刷新显示,以展示新添加的学生。
代码示例(简单的控制台学生管理系统)
模型(Model)部分
假设使用一个简单的std::vector来存储学生信息,学生信息用一个Student结构体表示。
#include <iostream>
#include <vector>
#include <string>
struct Student {
std::string name;
int id;
float grade;
};
class StudentModel {
private:
std::vector<Student> students;
public:
void addStudent(const Student& student) {
students.push_back(student);
}
std::vector<Student> getStudents() const {
return students;
}
};
视图(View)部分
负责在控制台打印学生信息。
class StudentView {
public:
void displayStudents(const std::vector<Student>& students) {
std::cout << "学生列表:" << std::endl;
for (const Student& student : students) {
std::cout << "姓名:" << student.name << ",学号:" << student.id << ",成绩:" << student.grade << std::endl;
}
}
};
控制器(Controller)部分
处理用户输入并协调模型和视图。
class StudentController {
private:
StudentModel model;
StudentView view;
public:
void addStudent(const Student& student) {
model.addStudent(student);
std::vector<Student> students = model.getStudents();
view.displayStudents(students);
}
};
使用示例
int main() {
StudentController controller;
Student student1{"张三", 1001, 85.0f};
controller.addStudent(student1);
Student student2{"李四", 1002, 90.0f};
controller.addStudent(student2);
return 0;
}
优点
- 分离关注点:
MVC 模式将数据处理、用户界面展示和用户交互逻辑分离到不同的组件中。这使得代码更易于理解和维护。例如,在一个大型的电商网站中,商品数据的管理(模型)、商品页面的设计和展示(视图)以及用户购买操作的处理(控制器)可以由不同的团队或开发人员分别负责,提高了开发效率。 - 可扩展性强:
由于各部分职责明确,当应用程序需要添加新功能时,只需要在相应的组件中进行扩展。比如,在学生管理系统中,如果要添加一个新的成绩统计功能,只需要在模型中添加统计方法,在视图中添加展示统计结果的部分,控制器可以协调两者之间的交互。 - 便于测试:
可以分别对模型、视图和控制器进行单元测试。因为每个部分的功能相对独立,测试起来更加方便。例如,对于模型部分,可以单独测试数据存储和检索功能是否正确,而不需要考虑用户界面的因素。
缺点
- 增加系统复杂度:
对于简单的应用程序,使用 MVC 模式可能会导致过度设计,增加不必要的复杂性。因为需要定义和维护三个不同的组件以及它们之间的交互,这可能会使代码量增加,对于小型项目来说,开发成本可能会变高。 - 学习成本较高:
开发人员需要理解 MVC 模式的工作原理以及三个组件之间的相互关系,对于新手来说,学习和上手的难度较大。而且,在实际应用中,如果没有正确地划分三个组件的职责,可能会导致代码混乱,反而不利于维护。