Qt 项目架构之----MVC架构

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 attackedvoid beAttack(int att);//is dead?bool dead() { return m_nHp == 0; }public://set novoid setNo(std::string no) { m_sNo = no; }//get nostd::string getNo() { return m_sNo; }//set namevoid setName(std::string name) { m_sName = name; }//get namestd::string getName() { return m_sName; }//get hpvoid setHp(int hp) { m_nHp = hp; }//set hpint getHp() { return m_nHp; }//set attvoid setAtt(int att) { m_nAtt = att; }//get attint 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 checkm_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 类

#pragma once
class HeroController
{
public:HeroController(string no, string name);~HeroController();void setHeroHp(int hp);//set hero hpvoid setHeroAtt(int att);//set hero attvoid show();//show hero infovoid beAttack(int att);//be attacked by herovoid dead();//deadvoid winned();//winnedHero* getHero() { return m_hero; }//get heroprivate:Hero * m_hero;//heroHeroView * 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","孟栋");//设置血量100controller->setHeroHp(100);controller->setHeroAtt(40);//显示一下血量controller->show();//初始化第二个英雄的控制器HeroController* controller2 = new HeroController("2016", "黑魔王");//设置血量100controller2->setHeroHp(200);//设置攻击力20controller2->setHeroAtt(20);//显示一下血量controller2->show();//hero1 attack hero2controller2->beAttack(controller->getHero()->getAtt());//ui更新controller2->show();//如果没有dead,就一直攻击while (!controller2->getHero()->dead()){//hero1 attack hero2controller2->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 : 孟栋)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27798.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023 Testing Expo倒计时-聚焦风丘9003展位

请点击此处&#xff0c;即可进行在线登记报名并了解更多信息&#xff01;

25个高级SQL查询-列出结果集的前5行

本专栏中的许多示例将基于以下员工表(employee)。只有少数例子将以其他表格为基础;在这些情况下,表格将与示例一起进行说明。 一、WITH WITH AS 短语,也叫做子查询部分,定义一个SQL片断后,该SQL片断可以被整个SQL语句所用到。有的时候,with as 是为了提高SQL语句的可读…

2023 Testing Expo倒计时-聚焦Softing 9003展位

请点击此处&#xff0c;即可进行在线登记报名并了解更多信息&#xff01;

计算机二级c语言考试复习大纲(一战到底)

1.C语言关键字 1.数据类型关键字&#xff08;12个&#xff09; char(字符型) short&#xff08;短整型&#xff09; int&#xff08;整型&#xff09; long&#xff08;长整型&#xff09; float&#xff08;单精度浮点型&#xff09; double&#xff08;双精度浮点…

设计模式——单例模式

单例模式 定义 确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。 即保证一个类只有一个实例&#xff0c;并且提供一个全局访问点 优缺点、应用场景 优点 单例对象在内存中只有一个实例&#xff0c;减少了内存的开支。尤其对于一个频繁创建…

UE学习记录02----UMG创建控件模板+事件分发器

官网4.27&#xff1a; 创建控件模板 | 虚幻引擎文档 (unrealengine.com) 使用UMG创建的每个 控件蓝图 都被视为 用户控件&#xff0c;其可在其他控件蓝图中重复使用和放置。 其视觉效果和脚本功能都将延续到该蓝图中。 利用某些蓝图脚本&#xff0c;可创建UI控件的运行方式或…

TCP/IP详解

目录 一、OSI参考模型 1.图示 2.OSI七层模型各自作用 3.七层通信过程 二、IP协议 1.IPv4首部 2.IPv6首部 三、TCP协议 1.tcp首部格式 2.握手挥手图示 3.握手流程 4.为什么要三次握手&#xff1f; 5.四次挥手流程 6.为什么要四次分手&#xff1f; 7.为什么要等待…

使用 Pytest 运行 yaml 文件来驱动 Appium 自动化测试

目录 前言&#xff1a; 获取 yaml 文件 YamlTest 测试类 Appium 初始化 Pytest 测试类 自定义 runtest demo&#xff1a; 自定义错误输出 Yaml 使用方式规则 前言&#xff1a; 使用Pytest来运行yaml文件来驱动Appium自动化测试是一种方便且灵活的方法。通过将测试数据…

uniapp:针对与富文本解析的几种方法

第一章、富文本的解析方法 1.1 uniapp自带组件&#xff1a;rich-text <rich-text :nodes"nodes"></rich-text> 1.2 v-html <view v-html"item.content"></view> 1.3 uview组件&#xff1a;u-parse <u-parse :content&quo…

Linux·从 URL 输入到页面展现到底发生什么?

打开浏览器从输入网址到网页呈现在大家面前&#xff0c;背后到底发生了什么&#xff1f;经历怎么样的一个过程&#xff1f;先给大家来张总体流程图&#xff0c;具体步骤请看下文分解&#xff01; 总体来说分为以下几个过程: DNS 解析:将域名解析成 IP 地址TCP 连接&#xff1a…

Zoho Projects:Jira的理想替代品,让项目管理更高效

在软件开发生命周期中&#xff0c;项目管理一直是一个非常重要的环节。为了更好地协作、追踪项目的进程和管理任务&#xff0c;许多公司选择了Jira这款著名的项目管理工具&#xff0c;它是个非常强大的工具&#xff0c;但同时也有非常明显的缺点。今天&#xff0c;我们将向大家…

ChatGLM-6B+LangChain实战

目标&#xff1a;原始使用ChatGLM-6B可接受的文字长度有限&#xff0c;打算结合LangChain实现长文本生成摘要. 方法&#xff1a; step1&#xff1a;自定义一个GLM继承LangChain中的langchain.llms.base.LLM&#xff0c;load自己的模型. step2&#xff1a;使用LangChain的mapred…