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

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

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

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 }
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 }
控制台輸出如下:

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
多加點評,謝謝!