[架构]我的MVC使用

在整个 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;
};

工程目录


函数使用过程

1.在UI类中,调用Manager类中的请求数据函数
2.Manager类接收到网络数据后,调用Model类中的解析方法,使用观察者模式来通知UI类数据已有
3.UI类接收到通知后,通过Manager类来访问Model类中的数据

发布了449 篇原创文章 · 获赞 180 · 访问量 87万+

猜你喜欢

转载自blog.csdn.net/ouyangshima/article/details/9172931