在整个 GUI 编程领域,MVC模式是GUI界面开发的指导模式,基于表现层分离的思想把程序分为三大部分:Model-View-Controller,呈三角形结构。Model是指数据以及应用程序逻辑,View是指 Model的视图,也就是用户界面。这两者都很好理解,关键点在于Controller的角色以及三者之间的关系。MVC 已经拥有将近 50 年的历史了。早在几十年前,Smalltalk-76 就对 MVC 架构模式进行了实现,在随后的几十年历史中,MVC 产生了很多的变种,例如:HMVC、MVA、MVP、MVVM 和其它将 MVC 运用于其它不同领域的模式。
使用MVC模式最主要的目的就是视图层与数据层的解耦。
视图层和模型层没有直接的耦合,而是通过控制器作为中间人对信息进行传递,是通过观察者模式来进行解耦的。
这种 MVC 的设计分离了视图层和模型层之间的耦合,作为承担数据存储功能的模型层,可以通过控制器同时为多种不同的视图提供数据。
MVC和三层架构的关系?
三层架构是典型的架构模式,分为表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。三层架构的分层模式是典型的上下关系,上层依赖于下层。
但MVC作为表现模式是不存在上下关系的,而是相互协作关系。即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有可比性,是应用于不同领域的技术。
MVC中的Model
#include "BaseLoad.h"
#include "EntityStdafx.h"
class UserModel
{
public:
UserModel();
~UserModel();
public:
//解析报文数据
void parseLoginInfo(const stuJson& json);
public:
EntUser* getUserEnt();//数据结构
void setUserToken(std::string userToken);
std::string getUserToken();
bool isLogined();
private:
EntUser* mEntUser;
};
MVC中的Model之Enity
#include <stdio.h>
using namespace std;
typedef struct EntUser{
EntUser(){
init();
};
void init(){
_UserID = "";
_UserToken = "";
_Account = "";
_UserName = "尼古拉斯凯奇";
_HeadIcon = "face1.png";
_SchoolName = "清华附中";
_GradeName = "一年级";
_ClassName = "一班";
_TeacherName = "张华";
_Coin = 900;
_ExpireTime = 0l;//time(&_ExpireTime);
};
string _UserID;
string _UserToken;
string _Account;
string _UserName;
string _HeadIcon;
string _SchoolName;
string _GradeName;
string _ClassName;
string _TeacherName;
string _ExpireTimeStr;
long _ExpireTime;
int _Coin;//金币
}EntUser;
MVC中的Controller
这里的Manager就是Controller
#include "CDataHttp.hpp"
#include <stdio.h>
using namespace std;
#include "UserModel.hpp"
class UserManager : public cocos2d::Ref, public CDataHttpDelegate
{
public:
static UserManager* getInstance();
static void destroyInstance();
//接收网络数据,通知UI层数据已有
void endWithHttpData(eHttpType nOp,bool bSuccess,const stuJson& json) override;
public:
void reqUserInfo();//在UI层--请求网络数据
void reqLogin(string account,string pwd);
void reqHeadIcon(string headIcon);
void doLogout();
public:
UserModel* getUserModel();//数据与状态,网络数据的解析
EntUser* getUserEnt();//数据
private:
UserManager();
~UserManager();
private:
void init();
void loadUserToken();
void saveUserToken();
private:
UserModel* mUserModel;
};
工程目录
![](https://img-blog.csdnimg.cn/20190226174919457.jpg)
函数使用过程
1.在UI类中,调用Manager类中的请求数据函数
2.Manager类接收到网络数据后,调用Model类中的解析方法,使用观察者模式来通知UI类数据已有
3.UI类接收到通知后,通过Manager类来访问Model类中的数据