zoukankan      html  css  js  c++  java
  • 模型-视图-控制器的C++解释

    模型-视图-控制器 (MVC) 并非一种技术,而是软件设计/工程的一个概念。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()方法。

    #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
    

    控制器

    控制器可以让模型更新数据,并且让视图改变数据的呈现,例如显示一个对话框而不是直接输出到控制台。基本来说,它可以获取用户输入,并向视图或模型发送指令。

    #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;
    }
    

    为了避免视图和模型的循环依赖,我们使用函数指针来代表数据改变的事件,而不是用指向成员函数的指针。

    编译运行:

    Model Data = Model
    Data Changes: Changes
    

    model.setData("Changes")触发了模型中的数据改变事件。

  • 相关阅读:
    oracle授权另外一个用户访问自己创建的数据对象
    popupWindow使用详解
    oracle用户管理实例
    oracle用户管理入门
    sqlite数据库修改及升级
    android之listView定位到指定行同时隐藏输入键盘
    oracle数据库常用命令
    Oracle11g安装完成后给用户解锁
    Git学习笔记(一)
    gson使用详解
  • 原文地址:https://www.cnblogs.com/hellovenus/p/11315386.html
Copyright © 2011-2022 走看看