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 == ; }
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;//攻击力
};

Hero.h

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

Hero.cpp

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;
};

HeroView.h

 #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; }

HeroView.cpp

HeroController类:

 #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
public :
Hero* getHero() { return m_hero; }//get hero private:
Hero * m_hero;//hero
HeroView * m_heroView;//hero view
};

HeroController.h

 #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());
}

HeroController.cpp

main() 测试:

 // ConsoleApplication_C++1.cpp: 主项目文件。

 #include "stdafx.h"

 using namespace System;

 int main()
{
//初始化一个英雄的控制器
HeroController* controller = new HeroController("","孟栋");
//设置血量100
controller->setHeroHp();
controller->setHeroAtt();
//显示一下血量
controller->show(); //初始化第二个英雄的控制器
HeroController* controller2 = new HeroController("", "黑魔王");
//设置血量100
controller2->setHeroHp();
//设置攻击力20
controller2->setHeroAtt();
//显示一下血量
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 ;
}

main

 
    控制台输出如下:
 
             Hero info : (no:, name : 孟栋, att : , hp : )
Hero info : (no : , name : 黑魔王, att : , hp : )
Hero info : (no : , name : 黑魔王, att : , hp : )
Hero info : (no : , name : 黑魔王, att : , hp : )
Hero info : (no : , name : 黑魔王, att : , hp : )
Hero info : (no : , name : 黑魔王, att : , hp : )
Hero info : (no : , name : 黑魔王, att : , hp : )
Hero Dead : (no : , name : 黑魔王)
Hero info : (no : , name : 孟栋, att : , hp : )
Hero Winned : (no : , name : 孟栋)

多加点评,谢谢!

设计模式--MVC(C++版)的更多相关文章

  1. python设计模式第2版

    python设计模式第2版 目录 第1章 设计模式简介 1 1.1 理解面向对象编程 1 1.1.1 对象 2 1.1.2 类 2 1.1.3 方法 2 1.2 面向对象编程的主要概念 3 1.2.1 ...

  2. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  3. spring mvc注解版01

    spring mvc是基于servlet实现的在spring mvc xml版中已经说过了,注解版相较于xml版更加简洁灵活. web项目的jar包: commons-logging-1.1.3.ja ...

  4. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  5. MySQL数据库(4)- 多表查询、可视化工具Navicat的使用、设计模式MVC

    一.多表查询 准备工作:创建两张表,部门表(department).员工表(employee),代码和表格如下: # 创建表 create table department( id int, name ...

  6. Dot Net设计模式—MVC模式

    1 MVC设计模式简介 MVC结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离.MVC作为一种开发模型,通常用于分布式应用系统的设计和分析中,以及用于确定 ...

  7. iOS设计模式——MVC(Model-View-Controller)

    Modol View Controller(MVC)是一种最早的也是最成功的可重用的设计模式,70年代的时候首次在smaltalk编写的程序中成功使用.基于MVC设计 模式,Cocoa整体架构可以划分 ...

  8. 《大话设计模式》Python版代码实现

    上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的 ...

  9. 《大话设计模式》ruby版代码:简单工厂模式

    之前有看过<ruby设计模式>,不过渐渐的都忘记了.现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下. # -*- encoding: utf-8 -*- #运 ...

随机推荐

  1. 解决MVC中JsonResult返回 弹出文件下载对话框

    设置一下返回类型为HTML TEXT就可以了 JsonResult json = Json(xxx, JsonRequestBehavior.DenyGet); json.ContentType = ...

  2. java学习(一)静态代码块 构造代码块 构造方法的执行顺序及注意问题

    今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题 首先要知道静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载 当时做了这么一个小案例(想必 ...

  3. iOS开发之数据存储之SQLite3(包括FMDB)

    1.概述 SQLite3是一款开源的嵌入式关系型数据库,可移植性好.易使用.内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中.比如下列的创表语句是合法的: c ...

  4. redis CONFIG REWRITE介绍

    可用版本为>= 2.8.0 CONFIG REWRITE 命令对启动 Redis 服务器时所指定的 redis.conf 文件进行改写: 因为 CONFIG SET 命令可以对服务器的当前配置进 ...

  5. pyqt样式表语法笔记(下)--原创

    pyqt样式表语法笔记(下) python 启动界面 QSS pyqt 一.启动界面的设置 简单点~说话的方式简单点用一张静态图片作为程序启动界面为例. 原来的语句     python    7行 ...

  6. 自己开发图表插件,脱离echart

    前言 由于公司业务需要做一些图标来展示一些数据,之前都是用百度的echart.js.这次放弃使用它转而自己开发是有几个原因1.echart文件太大,有些功能用不到2.echart样式不易扩展3.需求简 ...

  7. unity插件开发——一个例子:简单的svn集成

    在unity开发过程中,通常我们习惯性地在Windows操作系统下使用svn进行版本管理,而每次提交更新,都需要回到文件夹下的这种操作让人无法忍受.是不是可以集成svn到unity中呢?查了一圈uni ...

  8. AngularJS1.X学习笔记5-加强版的表单

    大家愚人节快乐!表单是沟通服务器端和客户端的桥梁,为数据从客户端传到服务端打开了一扇大门.AngularJS增加了一些新特性,使我们能够更加方便的操作表单.OK!开始学习!学习使我快乐. 一.双向数据 ...

  9. Spring Hiernate整合

    Spring整合Hibernate 一.整合目标 1.由IoC容器管理Hibernate的SessionFactory2.让Hibernate使用Spring的声明式事务 二.整合步骤 先加入Hibe ...

  10. 635B. Bear and Compressing

    B. Bear and Compressing time limit per test 2 seconds memory limit per test 256 megabytes input stan ...