模型-視圖-控制器 (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