模型-視圖-控制器的C++解釋

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

MVC Demo

有了上面的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

相關文章
相關標籤/搜索