模型-视图-控制器 (MVC) 并不是一种技术,而是软件设计/工程的一个概念。MVC包含三个组成部分,以下图所示ios
模型直接响应对数据的处理,好比数据库。模型不该依赖其它组成部分,即视图或控制器,换句话说,模型不关心它的数据如何展现和更新。数据库
模型中的数据发生改变,将会发出事件。好比视图模型必须注册模型,以了解数据是如何发生改变的。咱们能够在数据改变时定义一个函数回调。mvc
#ifndef COMMON_H #define COMMON_H #include <string> using namespace std; typedef void(*dataChangeHandler)(const string &data); #endif // !COMMON_H
dataChangeHandler是一个返回类型为空,含有一个string类型参数的函数指针,模型负责获取数据,并可选择地注册数据改变事件。函数
#ifndef MODEL_H #define MODEL_H #include <string> using namespace std; #include "common.h" class Model { public: Model(const string &strData) { this->setData(strData); } Model() { } string data() { return this->m_strData; } void setData(const string &strData) { this->m_strData = strData; if (this->event != nullptr) { this->event(strData); } } void registerDataChangeHandler(dataChangeHandler handler) { this->event = handler; } private: string m_strData = ""; dataChangeHandler event = nullptr; }; #endif // !MODEL_H
视图知道如何将数据呈现给用户,它须要接触模型而且一般须要定义它的render()方法。this
#ifndef VIEW_H #define VIEW_H #include <iostream> #include "Model.h" class View { public: View(const Model &model) { this->model = model; } View() {} void setModel(const Model &model) { this->model = model; } void render() { std::cout << "Model Data = " << model.data() << endl; } private: Model model; }; #endif // !VIEW_H
控制器能够让模型更新数据,而且让视图改变数据的呈现,例如显示一个对话框而不是直接输出到控制台。基原本说,它能够获取用户输入,并向视图或模型发送指令。spa
#ifndef CONTROLLER_H #define CONTROLLER_H #include "Model.h" #include "View.h" class Controller { public: Controller(const Model &model, const View &view) { this->setModel(model); this->setView(view); } void setModel(const Model &model) { this->model = model; } void setView(const View &view) { this->view = view; } void onLoad() { this->view.render(); } private: Model model; View view; }; #endif // !CONTROLLER_H
有了上面的3个组成类,咱们能够经过下面的代码解释MVC。设计
#include <iostream> #include "View.h" #include "Model.h" #include "Controller.h" #include "Common.h" using namespace std; void dataChange(const string &strData) { cout << "Data Changes: " << strData << endl; } int main() { Model model("Model"); View view(model); model.registerDataChangeHandler(&dataChange); Controller controller(model, view); controller.onLoad(); model.setData("Changes"); return 0; }
为了不视图和模型的循环依赖,咱们使用函数指针来表明数据改变的事件,而不是用指向成员函数的指针。3d
编译运行:指针
Model Data = Model Data Changes: Changes
model.setData("Changes")
触发了模型中的数据改变事件。code