MVC、MVP和MVVM模式-2.MVP模式

时间:2025-02-03 10:44:14

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