模型-视图-控制器的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

相关文章
相关标签/搜索