百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Qt项目MVC架构

ccwgpt 2024-11-22 11:34 15 浏览 0 评论

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型)-是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
  • View(视图) -是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器) - 是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。

MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。

以 C++ 代码为例,设计英雄(Hero)对战 demo。Hero1 对 Hero2 进行攻击,Hero2 不断掉血,UI 同步更新。主要三个类,分别为 Hero(英雄数据类),HeroView(英雄UI类,如血条)和 HeroController(英雄控制器类,Hero 管理类)。

Hero 类:

#pragma once 
 
class Hero
{
public:
    Hero();
    ~Hero();
    //be attacked
    void beAttack(int att);
    //is dead?
    bool dead() { return m_nHp == 0; }
    public:
    //set no
    void setNo(std::string no) { m_sNo = no; }
    //get no
    std::string getNo() { return m_sNo; }

    //set name
    void setName(std::string name) { m_sName = name; }
    //get name
    std::string getName() { return m_sName; }

    //get hp
    void setHp(int hp) { m_nHp = hp; }
    //set hp
    int getHp() { return m_nHp; }

    //set att
    void setAtt(int att) { m_nAtt = att; }
    //get att
    int getAtt() { return m_nAtt; }
private:

    std::string m_sName;//姓名
    std::string m_sNo;//游戏场号码

    int m_nHp;//血量
    int m_nAtt;//攻击力
};
#include "stdafx.h"
#include "Hero.h"

//ctor
Hero::Hero()
{
}

//Destructor
Hero::~Hero()
{
 
}
 
void Hero::beAttack(int att)
{
    if (att <= 0) throw "Att Number <= 0";//safe check
    m_nHp -= att;
    m_nHp = m_nHp < 0 ? 0 : m_nHp;//safe check
}

HeroView 类:

#pragma once
class HeroView
{
public:
    HeroView();
    ~HeroView();

    //show hero UI data;
    void show(string no, string name,int att, int hp);
    //show hero dead UI;
    void dead(string no, string name);
    //show heor winned UI;
    void winned(string no, string name);
    private:
    //Hero* m_hero;
};
#include "stdafx.h"
#include "HeroView.h"

HeroView::HeroView()
{
}

HeroView::~HeroView()
{
}

void HeroView::show(string no,string name, int att, int hp)
{
    cout << "Hero info:"<<"(no:"<<no<<",name:"<<name<<",att:"<<att<<",hp:"<<hp<<")" << endl;
}

void HeroView::dead(string no, string name)
{
    cout << "Hero Dead:" << "(no:" << no << ",name:"<<name << ")" << endl;
}

void HeroView::winned(string no, string name)
{
    cout << "Hero Winned:" << "(no:" << no << ",name:" << name << ")" << endl;

}

HeroController 类:

QT开发交流+赀料君羊:714620761

#pragma once
class HeroController
{
public:
      HeroController(string no, string name);
      ~HeroController();
      void setHeroHp(int hp);//set hero hp
      void setHeroAtt(int att);//set hero att
      void show();//show hero info
      void beAttack(int att);//be attacked by hero
      void dead();//dead
      void winned();//winned

     Hero* getHero() { return m_hero; }//get hero
 
private:
     Hero * m_hero;//hero
     HeroView * m_heroView;//hero view
};
#include "stdafx.h"
#include "HeroController.h"
 
HeroController::HeroController(string no, string name)
{
    m_heroView = new HeroView();
    m_hero = new Hero();
    m_hero->setNo(no);
    m_hero->setName(name);
}

HeroController::~HeroController()
{
}

void HeroController::setHeroHp(int hp)
{
    m_hero->setHp(hp);
}

void HeroController::setHeroAtt(int att)
{
    m_hero->setAtt(att);
}

void HeroController::show()
{
    m_heroView->show(m_hero->getNo(), m_hero->getName(),m_hero->getAtt(), m_hero->getHp());
}

void HeroController::beAttack(int att)
{
    m_hero->beAttack(att);
}

void HeroController::dead()
{
    m_heroView->dead(m_hero->getNo(),m_hero->getName());
}

void HeroController::winned()
{
    m_heroView->winned(m_hero->getNo(), m_hero->getName());
}

main() 测试:

// ConsoleApplication_C++1.cpp: 主项目文件。
  
#include "stdafx.h"

using namespace System;

int main()
{
    //初始化一个英雄的控制器
    HeroController* controller = new HeroController("2017","孟栋");
    //设置血量100
    controller->setHeroHp(100);
    controller->setHeroAtt(40);
    //显示一下血量
    controller->show();

    //初始化第二个英雄的控制器
    HeroController* controller2 = new HeroController("2016", "黑魔王");
    //设置血量100
    controller2->setHeroHp(200);
    //设置攻击力20
    controller2->setHeroAtt(20);
    //显示一下血量
    controller2->show();

    //hero1 attack hero2
    controller2->beAttack(controller->getHero()->getAtt());
    //ui更新
    controller2->show();

    //如果没有dead,就一直攻击
    while (!controller2->getHero()->dead())
    {
        //hero1 attack hero2
        controller2->beAttack(controller->getHero()->getAtt());
        //ui更新
        controller2->show();
    }

    controller2->dead();
    controller->show();
    controller->winned();

    return 0;
}

控制台输出如下:

Hero info : (no:2017, name : 孟栋, att : 40, hp : 100)
Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 200)
Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 160)
Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 120)
Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 80)
Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 40)
Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 0)
Hero Dead : (no : 2016, name : 黑魔王)
Hero info : (no : 2017, name : 孟栋, att : 40, hp : 100)
Hero Winned : (no : 2017, name : 孟栋)

相关推荐

VUE3前端开发入门系列教程二:使用iView框架辅助开发

1、安装iView新框架,支持VUE3npminstallview-ui-plus2、编辑src/main.js,添加以下内容,导入js和css到项目importViewUIPlusfrom...

万能前端框架uni app初探03:底部导航开发

前言本节我们使用uniapp的底部导航功能,点击不同tab会显示不同页面,这个功能在实际项目开发中几乎是必备的。一、基础知识1.tabBar如果应用是一个多tab应用,可以通过tabBar配...

Rust Web 开发框架,前端你可以选择哪个?

Rust构建一切。在如今流行的语言中,Rust可谓是将构建和高效作为自己优美的身姿在大众视野中脱颖而出。它是一门赋予每个人构建可靠且高效软件能力的语言。它有什么特性呢?高性能。Rust速度惊人且内...

连载:前端开发中纠结的Javascript框架(上)

如今,前端开发有着许许多多的框架和库。其中一些好用,一些却不尽人意。通常我们会习惯性运用某一概念,模块或句法。事实上,并没有什么万能工具。这篇文章是关于未来框架的发展趋势——那就是没有框架!我从以下几...

前端开发框架的演进架构:提升用户体验和开发效率

前端开发框架是现代Web应用开发的重要工具,它不仅可以帮助开发者构建复杂的用户界面,还能够提升用户体验和开发效率。随着Web技术的不断发展,前端开发框架也在不断演进,为开发者提供了更丰富、更高效的工具...

Google应用Mesh-TensorFlow框架,让CNN也能处理超高分辨率图像

为了要处理超高分辨率医疗图像数据,Google开发了一种空间数据分区(SpatialPartition)技术,在不牺牲图像分辨率的条件下,分析超高分辨率图像。Google使用Mesh-TensorF...

大模型安全挑战加剧:框架层漏洞成新靶心

近日,360数字安全集团发布了一份关于大模型安全漏洞的报告,揭示了当前大模型及围绕其构建的框架和应用中存在的严重安全问题。报告显示,360近期研究发现了近40个大模型相关的安全漏洞,其中既包括二进制内...

Keras 3.0正式发布:可用于TensorFlow、JAX和PyTorch

机器之心报道编辑:陈萍经过5个月的更新迭代,Keras3.0终于来了。「大新闻:我们刚刚发布了Keras3.0版本!」Keras之父FrancoisChollet在X上激动的...

TensorFlow和Keras入门必读教程(tensorflow与keras版本对应)

导读:本文对TensorFlow的框架和基本示例进行简要介绍。作者:本杰明·普朗什(BenjaminPlanche)艾略特·安德烈斯(EliotAndres)来源:华章科技01TensorFlo...

谷歌官方回应“TensorFlow遭弃”:还在投资开发,将与JAX并肩作战

鱼羊发自凹非寺量子位|公众号QbitAI终于,谷歌出面回应“TensorFlow遭弃”传闻:我们将继续致力于将TensorFlow打造为一流机器学习平台,与JAX并肩推动机器学习研究。这段时...

2025 年的PHP :现代 Web 开发的强大引擎

程序员还在吐槽PHP过时?2025年的PHP8.4直接封神了。看看最近更新的属性钩子、强类型系统,加上Laravel这些框架,老语言早就脱胎换骨。十年前说PHP弱类型容易崩代码的,现在脸疼不?联合类...

前端内卷终结者?htmx如何让开发者告别200行JS只做一个按钮

当你用React写一个点赞按钮需要引入3个状态管理库、编写80行JSX和120行钩子函数时,htmx只需要一行HTML:<buttonhx-post="/like"hx-sw...

NativePHP桌面版V1.0正式发布(元气桌面电脑版下载)

导读:各位小伙伴,使用PHP构建桌面级系统的利器,NativePHP来了。概述NativePHP是一个用于使用PHP构建桌面应用的框架。它允许PHP开发人员使用熟悉的工具和技术创建跨平台的原生应用...

PHP Laravel框架底层机制(php基本框架)

当然可以,Laravel是最受欢迎的PHP框架之一,以优雅的语法和丰富的生态而闻名。尽管开发体验非常“高端”,它的底层其实是由一系列结构清晰、职责分明的组件构成的。下面我从整体架构、核心流程、...

PHP框架之Laravel框架教程:2. 控制器、路由、视图简单介绍

2.控制器、路由、视图简单介绍我们先建立控制器,目录是:app/Http/Controllers,新建控制器Ding.php,代码如下:Ding.php:<?phpnamespaceA...

取消回复欢迎 发表评论: