MVC框架设计思想和设计模式

目录

一:单例模式适应范围

二:单例模式优缺点

三:MVC设计模式

四:MVC设计核心代码

4.1 mysqlite.h .cpp---数据库

4.2 widget.h .cpp---视图层

4.3 mycontroller.h .cpp---控制层

4.4 mymodel.h .cpp---模型层

4.5 实现结果:视图中不进行数据库的相关操作

本次没有完成好,程序异常结束(我也不知道为啥),没有进入getUserModelByUserName函数中,下次有时间回来看看。


一:单例模式适应范围

单例模式可以保证:在一个应用程序中,一个类有且只有一个实例,

并提供一个访问它的全局访问点。

在程序设计过程中,有很多情况需要确保一个类只有一个实例。

二:单例模式优缺点

优点:该实现是一个"懒汉"单例模式,意味着只有在第一次调用GetInstance()

          静态方法的时候才进行内存分配。如果整个程序不调用该静态方法,则

         不会分配内存。相对应的是"饿汉"单例模式。

缺点:1."懒汉"模式虽然有优点,但是每次调用GetInstance()静态方法时,必须判断

                     NULL == m_instance,使程序相对开销增大。

           2.由于使用指针动态内存分配,我们必须在程序结束时,手动的调用ReleaseInst

                   ance()静态方法,进行内存的释放。

            3. 教科书标准实现最大的缺点是线程不安全。根据该模式的定义,整个应用程序

                   中,不管是单线程,还是多线程,都只能有且只有该类的一个实例。而在多线

                   程中会导致多个实例的产生,从而导致运行代码不正确以及内存的泄露。

三:MVC设计模式

       MVC的英文全称为Model-View-Controller,即把一个信息系统的应用按照模型(Model)、视图(View)、控制器(Controller)的方式进行分离,这样一个应用就被分成三层:模型层、视图层和控制层。 

        通过视图层去操作控制器(将数据信息传输给控制器),由控制器去找到对应的模型,在模型中去访问数据库,数据库返回出来的结果通过模型返回给控制器,再将控制器中的数据返回给视图层 。

四:MVC设计核心代码

4.1 mysqlite.h .cpp---数据库

#ifndef MYSQLITE_H
#define MYSQLITE_H

#include"sqlite3.h"
#include<QString>//定义用户名密码

class mySqlite
{
public:
    static mySqlite *getInstance(char *dataBaseName);//公有的静态的获取类对象指针的方法

    static void createUserTable(char *tableName);//建表

    static int getData(const char *sql,char **&result,int &row,int &col);

    sqlite3 *getAppDataBase();//获取数据库对象

private:

    mySqlite(char *dataBaseName);//构造函数私有化
    ~mySqlite();

    static mySqlite *PdataBase;//私有的静态的类对象指针

    sqlite3 *appDataBase;//数据库指针
};


#endif // MYSQLITE_H
#include "mysqlite.h"
#include<QDebug>

mySqlite *mySqlite::PdataBase = nullptr;//类对象指针

mySqlite *mySqlite::getInstance(char *dataBaseName)
{
    if(mySqlite::PdataBase == nullptr)
    {
        mySqlite::PdataBase = new mySqlite(dataBaseName);
    }
    return mySqlite::PdataBase;
}

void mySqlite::createUserTable(char *tableName)
{
       char *zErrMsg = 0;
       QString createTablesql=QString("CREATE TABLE if not exists %1(\
                                      userID integer  primary key autoincrement,\
                                      userName text not null,\
                                      userPasswd text not null\
                                      );").arg(tableName);
       int  rc=sqlite3_exec(PdataBase->appDataBase, createTablesql.toStdString().c_str(), nullptr, 0, &zErrMsg);
       if( rc != SQLITE_OK )
       {
           qDebug()<<zErrMsg;
           qDebug()<<createTablesql;
       }
       else
       {
           qDebug()<<tableName<<"table created successfully!";
       }
}

int mySqlite::getData(const char *sql, char **&result, int &row, int &col)
{
     char *errmsg = 0;
     int ret = sqlite3_get_table(PdataBase->appDataBase,sql,&result,&row,&col,&errmsg);
     if(ret != SQLITE_OK)
     {
        qDebug()<<sqlite3_errmsg(PdataBase->appDataBase);
        qDebug()<<sqlite3_errcode(PdataBase->appDataBase);
     }
     return 0;
}

sqlite3 *mySqlite::getAppDataBase()
{
    return this->appDataBase;
}

mySqlite::mySqlite(char *dataBaseName)
{
    //打开数据库
    int ret = sqlite3_open(dataBaseName,&appDataBase);//数据库不存在自动创建
    if(ret)
    {
        qDebug()<<"Can't open DataBase";
        qDebug()<<sqlite3_errmsg(appDataBase);
        exit(0);
    }
    else
    {
        qDebug()<<"Open"<<dataBaseName<<"successfully!";
    }
}

mySqlite::~mySqlite()
{
    //关闭数据库
    sqlite3_close(appDataBase);
}

4.2 widget.h .cpp---视图层

#include"mycontroller.h"

//视图层中定义控制器
myController *pusercontroller;

void Widget::goLoginSlot()
{
    qDebug()<<"点击登录";//测试

    //获取 编辑框内容
    //获取输入的用户名
    QString username = userEdit->text();
    //qDebug()<<username; //测试
    //获取输入的密码
    QString userpwd = pwdEdit->text();
   //视图层
   int ret1 = pusercontroller->findUserModelByUserName(username);
   if(ret1 == 0)
   {
       qDebug()<<"登录成功";
   }
   else
   {
       qDebug()<<"登录失败";
   }
}

4.3 mycontroller.h .cpp---控制层

#ifndef MYCONTROLLER_H
#define MYCONTROLLER_H
#include<QString>
#include"mymodel.h"

class myController
{
public:
    //静态的公有的获取类对象指针的方法
    static myController*getIntance();
    //控制器->模型
    int findUserModelByUserName(QString username);
private:
    //构造函数私有化
    myController();
    //定义一个静态的类对象指针
    static myController*pmyController;
    //定义一个模型对象
    myModel *pusermodel;
};

#endif // MYCONTROLLER_H
#include "mycontroller.h"
#include<QDebug>

myController*myController::pmyController = nullptr;

myController *myController::getIntance()
{
    if(myController::pmyController == nullptr)
    {
        myController::pmyController = new myController;
    }
    return myController::pmyController;
}

int myController::findUserModelByUserName(QString username)
{
    qDebug()<<"findUserModelByUserName";
    //通过用户名查找数据库里的内容
    return pusermodel->getUserModelByUserName(username);
}

myController::myController()
{
    pusermodel = myModel::getIntance();
}

4.4 mymodel.h .cpp---模型层

#ifndef MYMODEL_H
#define MYMODEL_H
#include"mysqlite.h"
#include<QString>
class myModel
{
public:
    //静态公有获取类对象指针的方法  模型--get方法
    static myModel*getIntance();

    int getUserModelByUserName(QString username);
private:
    //构造函数私有化
    myModel();
    //静态私有的类对象指针
    static myModel*pmyModel;
    //数据库对象
    mySqlite *appdb;
};

#endif // MYMODEL_H
#include "mymodel.h"
#include<QDebug>

myModel*myModel::pmyModel = nullptr;

myModel *myModel::getIntance()
{
    if(myModel::pmyModel == nullptr)
    {
        myModel::pmyModel = new myModel;
    }
    return myModel::pmyModel;
}

int myModel::getUserModelByUserName(QString username)
{
    qDebug()<<"getUserModelByUserName";
    //模型操作数据库
    char **result = nullptr;
    int nRow = 0;
    int nCol = 0;
    QString selectUser = QString("select userName from user where userName = '%1'").arg(username);
    int ret = mySqlite::getData(selectUser.toLatin1(),result,nRow,nCol);
    if(ret ==0)
    {
        qDebug()<<"nRow"<<nRow;
        if(nRow == 0)
        {
            qDebug()<<"该用户不存在";
        }
        else
        {
            qDebug()<<"该用户存在";
            return 0;
        }
    }
    else
    {
        return -1;
    }
}

myModel::myModel()
{
    //获取数据库对象指针
    appdb = mySqlite::getInstance("app.db");
}

4.5 实现结果:视图中不进行数据库的相关操作

本次没有完成好,程序异常结束(我也不知道为啥),没有进入getUserModelByUserName函数中,下次有时间回来看看。

解决:

方法一:

 

方法二:

​​​​​​​

猜你喜欢

转载自blog.csdn.net/m0_56051805/article/details/124974130
今日推荐