麓谷做网站的公司,信用网站建设工作总结,wordpress 二级目录安装,哈尔滨网络公司平台MVC模式中#xff0c;视图和模型之间直接交互#xff0c;而MVP模式下#xff0c;视图与模型通过Presenter进行通信#xff0c;MVVM则采用双向绑定#xff0c;减少手动同步视图和模型的工作。每种模式都有其优缺点#xff0c;适合不同规模和类型的项目。
### MVVM 与 MVP…MVC模式中视图和模型之间直接交互而MVP模式下视图与模型通过Presenter进行通信MVVM则采用双向绑定减少手动同步视图和模型的工作。每种模式都有其优缺点适合不同规模和类型的项目。
### MVVM 与 MVP/MVC 的区别
1. **数据绑定**
- MVVM 强调 View 和 ViewModel 的自动同步。
- MVP/MVC 需要手动更新 View。
2. **View 的主动性**
- MVVM 中View 是完全被动的。
- MVP 中View 需要通过 Presenter 更新。
- MVC 中View 可以直接监听 Model 的变化。
3. **适用场景**
- MVVM 更适合需要频繁更新 UI 的场景如 GUI 应用。
- MVP/MVC 更适合简单的逻辑控制。
1.MVC模式 Model 负责存储和管理数据。 View 负责显示数据。 Controller 负责处理用户输入并更新模型然后通知视图更新显示。
1. 模型Model
模型负责管理应用程序的数据和业务逻辑。
// model.h
#ifndef MODEL_H
#define MODEL_Htypedef 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.hvoid 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
视图负责显示数据给用户。
// view.h
#ifndef VIEW_H
#define VIEW_H#include model.htypedef struct {Model *model;
} View;void View_init(View *view, Model *model);
void View_display(View *view);#endif // VIEW_H
// view.c
#include view.h
#include stdio.hvoid View_init(View *view, Model *model) {view-model model;
}void View_display(View *view) {printf(Data: %d\n, Model_getData(view-model));
}
3. 控制器Controller
控制器负责处理用户输入并更新模型。
// controller.h
#ifndef CONTROLLER_H
#define CONTROLLER_H#include model.h
#include view.htypedef struct {Model *model;View *view;
} Controller;void Controller_init(Controller *controller, Model *model, View *view);
void Controller_updateData(Controller *controller, int data);#endif // CONTROLLER_H
// controller.c
#include controller.hvoid Controller_init(Controller *controller, Model *model, View *view) {controller-model model;controller-view view;
}void Controller_updateData(Controller *controller, int data) {Model_setData(controller-model, data);View_display(controller-view);
}
4. 主程序
主程序将模型、视图和控制器组合在一起。
// main.c
#include model.h
#include view.h
#include controller.hint main() {Model model;View view;Controller controller;Model_init(model);View_init(view, model);Controller_init(controller, model, view);// 模拟用户输入Controller_updateData(controller, 10);Controller_updateData(controller, 20);return 0;
}
5. 输出结果
Data: 10
Data: 20
2.MVP模式 MVPModel-View-Presenter是MVC模式的一种变体它将视图和模型之间的交互通过Presenter主持人来协调。 Model 负责存储和管理数据。 View 负责显示数据并将用户输入传递给Presenter。 Presenter 负责处理用户输入更新模型并通知视图更新显示。
与MVC模式不同MVP模式中视图和模型之间没有直接交互所有的交互都通过Presenter来协调。这种设计使得视图和模型之间的耦合度更低更易于测试和维护。
1. 模型Model
模型负责管理应用程序的数据和业务逻辑。
// model.h
#ifndef MODEL_H
#define MODEL_Htypedef 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.hvoid 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_Htypedef 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.htypedef 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.hvoid 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
3.MVVM模式 MVVMModel-View-ViewModel是一种常用于GUI应用程序的设计模式它将视图View与模型Model通过视图模型ViewModel进行解耦。MVVM的核心思想是通过数据绑定将视图和视图模型连接起来但由于C语言本身不支持数据绑定等高级特性我们需要通过手动方式模拟MVVM的行为。 Model 负责存储和管理数据。 View 负责显示数据并将用户输入传递给视图模型。 ViewModel 负责将模型的数据转换为视图可以显示的形式并处理视图的输入。
在MVVM模式中视图和模型之间没有直接交互所有的交互都通过视图模型来协调。视图模型通过回调函数通知视图更新显示从而实现了视图和模型的解耦。
1. 模型Model
模型负责管理应用程序的数据和业务逻辑。
// model.h
#ifndef MODEL_H
#define MODEL_Htypedef 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.hvoid 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. 视图模型ViewModel
视图模型负责将模型的数据转换为视图可以显示的形式并处理视图的输入。
// viewmodel.h
#ifndef VIEWMODEL_H
#define VIEWMODEL_H#include model.htypedef struct {Model *model;void (*onDataChanged)(int data); // 数据改变时的回调函数
} ViewModel;void ViewModel_init(ViewModel *viewModel, Model *model);
void ViewModel_setData(ViewModel *viewModel, int data);
int ViewModel_getData(ViewModel *viewModel);#endif // VIEWMODEL_H
// viewmodel.c
#include viewmodel.hvoid ViewModel_init(ViewModel *viewModel, Model *model) {viewModel-model model;viewModel-onDataChanged NULL; // 初始化为空
}void ViewModel_setData(ViewModel *viewModel, int data) {//非常很重要,关键的一笔!!// 更新模型Model_setData(viewModel-model, data);// 通知视图数据已改变if (viewModel-onDataChanged ! NULL) {viewModel-onDataChanged(data);}
}int ViewModel_getData(ViewModel *viewModel) {return Model_getData(viewModel-model);
}
3. 视图View
视图负责显示数据并将用户输入传递给视图模型。
// view.h
#ifndef VIEW_H
#define VIEW_H#include viewmodel.htypedef struct {ViewModel *viewModel;
} View;void View_init(View *view, ViewModel *viewModel);
void View_display(View *view);
void View_userInput(View *view, int data);#endif // VIEW_H
// view.c
#include view.h
#include stdio.h// 数据改变时的回调函数
static void onDataChanged(int data) {printf(Data Updated: %d\n, data);
}void View_init(View *view, ViewModel *viewModel) {view-viewModel viewModel;viewModel-onDataChanged onDataChanged; // 设置回调函数
}void View_display(View *view) {int data ViewModel_getData(view-viewModel);printf(Current Data: %d\n, data);
}void View_userInput(View *view, int data) {// 将用户输入传递给视图模型ViewModel_setData(view-viewModel, data);
}
4. 主程序
主程序将模型、视图模型和视图组合在一起。
// main.c
#include model.h
#include viewmodel.h
#include view.hint main() {Model model;ViewModel viewModel;View view;// 初始化Model_init(model);ViewModel_init(viewModel, model);View_init(view, viewModel);// 显示初始数据View_display(view);// 模拟用户输入View_userInput(view, 10);View_userInput(view, 20);return 0;
}
5. 输出结果
Current Data: 0
Data Updated: 10
Data Updated: 20
**在deep seek协助下