MVP(Model-View-Presenter)是MVC模式的一种变体,它将视图和模型之间的交互通过Presenter(主持人)来协调。
-
Model 负责存储和管理数据。
-
View 负责显示数据,并将用户输入传递给Presenter。
-
Presenter 负责处理用户输入,更新模型,并通知视图更新显示。
与MVC模式不同,MVP模式中视图和模型之间没有直接交互,所有的交互都通过Presenter来协调。这种设计使得视图和模型之间的耦合度更低,更易于测试和维护。
1. 模型(Model)
模型负责管理应用程序的数据和业务逻辑。
// model.h
#ifndef MODEL_H
#define MODEL_H
typedef struct {
int data;
} Model;
void Model_init(Model *model);
void Model_setData(Model *model, int data);
int Model_getData(Model *model);
#endif // MODEL_H
// model.c
#include "model.h"
void Model_init(Model *model) {
model->data = 0;
}
void Model_setData(Model *model, int data) {
model->data = data;
}
int Model_getData(Model *model) {
return model->data;
}
2. 视图(View)
视图负责显示数据,并将用户输入传递给Presenter。
// view.h
#ifndef VIEW_H
#define VIEW_H
typedef struct {
void (*displayData)(int data); // 显示数据的回调函数
} View;
#endif // VIEW_H
3. Presenter(主持人)
Presenter负责处理视图的输入,更新模型,并通知视图更新显示
// presenter.h
#ifndef PRESENTER_H
#define PRESENTER_H
#include "model.h"
#include "view.h"
typedef struct {
Model *model;
View *view;
} Presenter;
void Presenter_init(Presenter *presenter, Model *model, View *view);
void Presenter_updateData(Presenter *presenter, int data);
#endif // PRESENTER_H
// presenter.c
#include "presenter.h"
void Presenter_init(Presenter *presenter, Model *model, View *view) {
presenter->model = model;
presenter->view = view;
}
void Presenter_updateData(Presenter *presenter, int data) {
// 更新模型
Model_setData(presenter->model, data);
// 从模型获取数据并通知视图更新
int currentData = Model_getData(presenter->model);
presenter->view->displayData(currentData);
}
4. 主程序
主程序将模型、视图和Presenter组合在一起。
// main.c
#include <stdio.h>
#include "model.h"
#include "view.h"
#include "presenter.h"
// 视图的具体实现
void displayData(int data) {
printf("Current Data: %d\n", data);
}
int main() {
Model model;
View view;
Presenter presenter;
// 初始化
Model_init(&model);
view.displayData = displayData; // 设置视图的回调函数
Presenter_init(&presenter, &model, &view);
// 模拟用户输入
Presenter_updateData(&presenter, 10);
Presenter_updateData(&presenter, 20);
return 0;
}
5.输出结果
Current Data: 10
Current Data: 20