設計模式--MVC(C++版)


     MVC 模式代表 Model-View-Controller(模型-視圖-控制器) 模式。這種模式用於應用程序的分層開發。

  • Model(模型)-是應用程序中用於處理應用程序數據邏輯的部分。通常模型對象負責在數據庫中存取數據。
  • View(視圖) -是應用程序中處理數據顯示的部分。通常視圖是依據模型數據創建的。
  • Controller(控制器) - 是應用程序中處理用戶交互的部分。通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。
    MVC 分層有助於管理復雜的應用程序,因為您可以在一個時間內專門關注一個方面。例如,您可以在不依賴業務邏輯的情況下專注於視圖設計。同時也讓應用程序的測試更加容易。
MVC 分層同時也簡化了分組開發。不同的開發人員可同時開發視圖、控制器邏輯和業務邏輯。
 
    以C++代碼為例,設計英雄(Hero)對戰demo。Hero1對Hero2進行攻擊,Hero2不斷掉血,UI同步更新。
 
    主要三個類,分別為Hero(英雄數據類),HeroView(英雄UI類,如血條)和HeroController(英雄控制器類,Hero管理類)。
 
    Hero類:
 1 #pragma once 
 2 
 3 class Hero
 4 {
 5 public:
 6     Hero();
 7     ~Hero();
 8     //be attacked
 9     void beAttack(int att);
10     //is dead?
11     bool dead() { return m_nHp == 0; }
12 public:
13     //set no
14     void setNo(std::string no) { m_sNo = no; }
15     //get no
16     std::string getNo() { return m_sNo; }
17 
18     //set name
19     void setName(std::string name) { m_sName = name; }
20     //get name
21     std::string getName() { return m_sName; }
22 
23     //get hp
24     void setHp(int hp) { m_nHp = hp; }
25     //set hp
26     int getHp() { return m_nHp; }
27     
28     //set att
29     void setAtt(int att) { m_nAtt = att; }
30     //get att
31     int getAtt() { return m_nAtt; }
32 private:
33     
34     std::string m_sName;//姓名
35     std::string m_sNo;//游戲場號碼
36     
37     int m_nHp;//血量
38     int m_nAtt;//攻擊力
39 };
Hero.h
 1 #include "stdafx.h"
 2 #include "Hero.h"
 3 
 4 //ctor
 5 Hero::Hero()
 6 {
 7 }
 8 
 9 //Destructor
10 Hero::~Hero()
11 {
12 
13 }
14 
15 void Hero::beAttack(int att)
16 {
17     if (att <= 0) throw "Att Number <= 0";//safe check
18     m_nHp -= att;
19     m_nHp = m_nHp < 0 ? 0 : m_nHp;//safe check
20 }
Hero.cpp

    HeroView類:

 1 #pragma once
 2 class HeroView
 3 {
 4 public:
 5     HeroView();
 6     ~HeroView();
 7 
 8     //show hero UI data;
 9     void show(string no, string name,int att, int hp);
10     //show hero dead UI;
11     void dead(string no, string name);
12     //show heor winned UI;
13     void winned(string no, string name);
14 private:
15     //Hero* m_hero;
16 };
HeroView.h
 1 #include "stdafx.h"
 2 #include "HeroView.h"
 3 
 4 
 5 
 6 HeroView::HeroView()
 7 {
 8 }
 9 
10 HeroView::~HeroView()
11 {
12 }
13 
14 void HeroView::show(string no,string name, int att, int hp)
15 {
16     cout << "Hero info:"<<"(no:"<<no<<",name:"<<name<<",att:"<<att<<",hp:"<<hp<<")" << endl;
17 }
18 
19 void HeroView::dead(string no, string name)
20 {
21     cout << "Hero Dead:" << "(no:" << no << ",name:"<<name << ")" << endl;
22 }
23 
24 void HeroView::winned(string no, string name)
25 {
26     cout << "Hero Winned:" << "(no:" << no << ",name:" << name << ")" << endl;
27 
28 }
HeroView.cpp

 

    HeroController類:

 1 #pragma once
 2 class HeroController
 3 {
 4 public:
 5     HeroController(string no, string name);
 6     ~HeroController();
 7     void setHeroHp(int hp);//set hero hp
 8     void setHeroAtt(int att);//set hero att
 9     void show();//show hero info
10     void beAttack(int att);//be attacked by hero
11     void dead();//dead
12     void winned();//winned
13 public :
14     Hero* getHero() { return m_hero; }//get hero
15 
16 private:
17     Hero * m_hero;//hero
18     HeroView * m_heroView;//hero view
19 };
HeroController.h
 1 #include "stdafx.h"
 2 #include "HeroController.h"
 3 
 4 
 5 HeroController::HeroController(string no, string name)
 6 {
 7     m_heroView = new HeroView();
 8     m_hero = new Hero();
 9     m_hero->setNo(no);
10     m_hero->setName(name);
11 }
12 
13 
14 HeroController::~HeroController()
15 {
16 }
17 
18 
19 void HeroController::setHeroHp(int hp)
20 {
21     m_hero->setHp(hp);
22 }
23 
24 void HeroController::setHeroAtt(int att)
25 {
26     m_hero->setAtt(att);
27 }
28 
29 void HeroController::show()
30 {
31     m_heroView->show(m_hero->getNo(), m_hero->getName(),m_hero->getAtt(), m_hero->getHp());
32 }
33 
34 void HeroController::beAttack(int att)
35 {
36     m_hero->beAttack(att);
37 }
38 
39 void HeroController::dead()
40 {
41     m_heroView->dead(m_hero->getNo(),m_hero->getName());
42 }
43 
44 void HeroController::winned()
45 {
46     m_heroView->winned(m_hero->getNo(), m_hero->getName());
47 }
HeroController.cpp

 

    main() 測試:

 1 // ConsoleApplication_C++1.cpp: 主項目文件。
 2 
 3 #include "stdafx.h"
 4 
 5 using namespace System;
 6 
 7 int main()
 8 {
 9     //初始化一個英雄的控制器
10     HeroController* controller = new HeroController("2017","孟棟");
11     //設置血量100
12     controller->setHeroHp(100);
13     controller->setHeroAtt(40);
14     //顯示一下血量
15     controller->show();
16 
17     //初始化第二個英雄的控制器
18     HeroController* controller2 = new HeroController("2016", "黑魔王");
19     //設置血量100
20     controller2->setHeroHp(200);
21     //設置攻擊力20
22     controller2->setHeroAtt(20);
23     //顯示一下血量
24     controller2->show();
25 
26     //hero1 attack hero2
27     controller2->beAttack(controller->getHero()->getAtt());
28     //ui更新
29     controller2->show();
30 
31     //如果沒有dead,就一直攻擊
32     while (!controller2->getHero()->dead())
33     {
34         //hero1 attack hero2
35         controller2->beAttack(controller->getHero()->getAtt());
36         //ui更新
37         controller2->show();
38     }
39 
40     controller2->dead();
41     controller->show();
42     controller->winned();
43 
44 
45 
46     return 0;
47 }
main
 
    控制台輸出如下:
 
 1             Hero info : (no:2017, name : 孟棟, att : 40, hp : 100)
 2         Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 200)
 3         Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 160)
 4         Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 120)
 5         Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 80)
 6         Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 40)
 7         Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 0)
 8         Hero Dead : (no : 2016, name : 黑魔王)
 9         Hero info : (no : 2017, name : 孟棟, att : 40, hp : 100)
10         Hero Winned : (no : 2017, name : 孟棟)
11     
View Code

 

多加點評,謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM