MVC蔫磨、MVX及Unity3D中的使用

1.什么是MVC:

1.1 定義:

MVC全名是Model View Controller己肮,是模型(Model)-視圖(View)-操控器(Controller)的縮寫衫哥,一種軟件規(guī)劃典范茎刚,用一種事務(wù)邏輯、數(shù)據(jù)撤逢、界面展現(xiàn)別離的方法組織代碼膛锭,將事務(wù)邏輯集合到一個部件里邊,在改進(jìn)和個性化定制界面及用戶交互的同時笛质,不需要從頭編寫事務(wù)邏輯泉沾。MVC被獨(dú)特的發(fā)展起來用于映射傳統(tǒng)的輸入、處理和輸出功用在一個邏輯的圖形化用戶界面的結(jié)構(gòu)中妇押。

Model(模型) 是運(yùn)用程序中用于處理運(yùn)用程序數(shù)據(jù)邏輯的部分跷究。
  一般模型政策擔(dān)任在數(shù)據(jù)庫中存取數(shù)據(jù)。
View(視圖) 是運(yùn)用程序中處理數(shù)據(jù)展現(xiàn)的部分敲霍。
  一般視圖是根據(jù)模型數(shù)據(jù)創(chuàng)建的俊马。
Controller(操控器) 是運(yùn)用程序中處理用戶交互的部分肩杈。
  一般操控器擔(dān)任從視圖讀取數(shù)據(jù),操控用戶輸入扩然,并向模型發(fā)送數(shù)據(jù)。

1.2 MVC閉環(huán):

MVC閉環(huán)

1.3 MVC關(guān)系圖:

MVC關(guān)系

簡而言之界睁,界面被分到了View,數(shù)據(jù)分到了載體Model上由Model“攜帶”翻斟,業(yè)務(wù)集中在Controller中,而推動業(yè)務(wù)的事件由用戶與View交互访惜,通過View向Controller發(fā)動嘹履。
舉例說明:
(1)例如债热,在controller中砾嫉,發(fā)現(xiàn)用戶點(diǎn)選了柱狀圖,那么則用柱狀圖view來展示數(shù)據(jù)窒篱,而柱狀圖view 是有數(shù)據(jù)model的引用的焰枢,直接獲取數(shù)據(jù)。
(2)例如舌剂,任何的一個View(柱狀或者餅狀圖)上济锄,點(diǎn)按下一頁的操作,則直接通過其引用的數(shù)據(jù)model 查詢獲得對應(yīng)的結(jié)果數(shù)據(jù)并展示霍转。
(3)例如荐绝,任何一個View(柱狀或者餅狀圖)上,點(diǎn)按刪除數(shù)據(jù)避消,不能直接和數(shù)據(jù)層Model交互低滩,而是通過事件方式,通知到Controller邏輯層岩喷,然后由邏輯層Controller和服務(wù)器或者數(shù)據(jù)庫交互恕沫,并通知數(shù)據(jù)Model層發(fā)生變化,而數(shù)據(jù)Model層發(fā)生改變后纱意,可以通過事件直接通知View刷新結(jié)果婶溯,當(dāng)然也可以是Controller改變的時候,先刷新Modle數(shù)據(jù)偷霉,再調(diào)用View去顯示迄委。

1.3 MVC的缺點(diǎn)

在MVC模型里,更關(guān)注模型層(Model)的不變类少,為了讓多個視圖層(View)的不同顯示叙身。所以,在MVC模型里硫狞,Model不依賴于View信轿,但是View是依賴于Model的。由于視圖層需要持有控制層的Activity引用才能進(jìn)行UI的引用和交互處理残吩,妨礙了視圖的獨(dú)立重用财忽。不僅如此,視圖層(View)是可以直接訪問模型層(Model)的世剖,從而視圖層不可避免會涉及一些業(yè)務(wù)邏輯定罢。因?yàn)樵赩iew里實(shí)現(xiàn)的業(yè)務(wù)邏輯是無法被重用的旁瘫,導(dǎo)致要更改和重用View變得比較困難。由于模型操作接口的不同惠况,視圖可能需要多次調(diào)用模型才能獲得足夠的顯示數(shù)據(jù)稠屠,不必要的頻繁訪問未變化數(shù)據(jù)的权埠,也損害一定性能攘蔽。
還有 通俗的說满俗,一個Modle和一個Control 對應(yīng) 多View唆垃。不能實(shí)現(xiàn)Modle和Controller的復(fù)用辕万。

2.什么是 MVX:

這里引用一個知乎高贊回答:M-V- X 本質(zhì)都是一樣的 重點(diǎn)還是在于M-V 的橋梁蓄坏,要靠X來牽線涡戳。
在相同技術(shù)棧下 能夠?qū)崿F(xiàn)的各種 X都可以是大同小異的脯倚。
在不同技術(shù)棧下 相同的X可能實(shí)現(xiàn)都大相徑庭推正,僅有非常抽象的流程類似植榕。

2.1 MV-P(Model-View-Presenter)

2.1.1 定義

MVP即Model-View-Presenter尊残。


image.png

image.png

Model的工作就是完成對數(shù)據(jù)的操縱顷扩,數(shù)據(jù)的獲取、存儲扎阶、數(shù)據(jù)狀態(tài)變化都是model層的任務(wù)东臀,如網(wǎng)絡(luò)請求啡邑,持久化數(shù)據(jù)增刪改查等任務(wù)
View只處理視圖相關(guān)谤逼,不做任何邏輯處理流部。
Presenter作為橋梁枝冀,處理所有二者之間的中轉(zhuǎn)果漾。

2.1.2 優(yōu)缺點(diǎn)

在這個模式下绒障,M和V的連接被完全切斷了捍歪,以前C層只是負(fù)責(zé)一些簡單的轉(zhuǎn)發(fā)和處理糙臼,現(xiàn)在P的任務(wù)變的更重变逃,除了橋梁的作用之外,還需要做初步甚至高級的邏輯處理來處理M-V或者V-M的交流過程名眉。如圖所示:


image.png

居然P的任務(wù)變重了,那么相對來說渊啰,P也會變得更加臃腫和難以維護(hù)绘证,但是好處是將M和V徹底解耦,不管哪一方的實(shí)現(xiàn)方式發(fā)生變化胞枕,只要最終和P同步的數(shù)據(jù)不變另一方都不需要關(guān)心和修改腐泻。

另外V的邏輯功能一部分移入P之后派桩,V可以更加專注的處理自身的表現(xiàn)铆惑,同時因?yàn)閷邮峭ㄟ^接口實(shí)現(xiàn)的员魏,所以滿足接口的各種測試或者模擬都能夠得以使用叠聋。

另外這里每一個V都對應(yīng)一個P碌补,寫法非常復(fù)雜脑慧,軟件復(fù)雜的時候,類和文件賊多坑律。并且它仍然沒有解決M復(fù)用的問題晃择。

2.2 MV-VM(Model-View-ViewModel)

2.2.1 定義

MVVM是Model-View-ViewModel的簡寫宫屠。


image.png

從圖上看是比MVP簡單了浪蹂,更不用說MVC了坤次。這可能是在MVP之后出現(xiàn)的一種“更好的”UI模式解決方案缰猴,但是用MVP來與之對比比較容易說明問題滑绒。ViewModel大致上就是MVP的Presenter和MVC的Controller了疑故,而View和ViewModel間沒有了MVP的界面接口焰扳,而是直接交互,用數(shù)據(jù)“綁定”的形式讓數(shù)據(jù)更新的事件不需要開發(fā)人員手動去編寫特殊用例扫茅,而是自動地雙向同步葫隙。數(shù)據(jù)綁定你可以認(rèn)為是Observer模式或者是Publish/Subscribe模式恋脚,原理都是為了用一種統(tǒng)一的集中的方式實(shí)現(xiàn)頻繁需要被實(shí)現(xiàn)的數(shù)據(jù)更新問題糟描。比起MVP书妻,MVVM不僅簡化了業(yè)務(wù)與界面的依賴關(guān)系,還優(yōu)化了數(shù)據(jù)頻繁更新的解決方案聊闯,甚至可以說提供了一種有效的解決模式米诉。所以我們能理解為什么許多人認(rèn)為MVVM是最好的一種模式史侣。但事實(shí)上抵窒,MVVM也是依賴于我們至今所講的“特有的情境”李皇。當(dāng)然掉房,最優(yōu)雅的也是第一個能作代表的實(shí)踐就是Windows Presentation Foundation(WPF)了卓囚。


image.png

2.2.2 優(yōu)缺點(diǎn)

MVVM模式和MVC模式一樣哪亿,主要目的是分離視圖(View)和模型(Model)蝇棉,有幾大優(yōu)點(diǎn):
1. 低耦合篡殷。視圖(View)可以獨(dú)立于Model變化和修改板辽,一個ViewModel可以綁定到不同的"View"上,當(dāng)View變化的時候Model可以不變醇坝,當(dāng)Model變化的時候View也可以不變。

2. 可重用性贸毕。你可以把一些視圖邏輯放在一個ViewModel里面明棍,讓很多view重用這段視圖邏輯摊腋。

3. 獨(dú)立開發(fā)嘁傀。開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel)橙凳,設(shè)計(jì)人員可以專注于頁面設(shè)計(jì)岛啸,使用Expression Blend可以很容易設(shè)計(jì)界面并生成xaml代碼坚踩。

4. 可測試瞬铸。界面素來是比較難于測試的嗓节,測試可以針對ViewModel來寫。

3. MVC耀怜、和(其他MVX們)MVP财破、MVVM設(shè)計(jì)模式和框架的區(qū)別:

MVC或者任何MVX 都是一種設(shè)計(jì)模式左痢。

框架系洛、設(shè)計(jì)模式這兩個概念總?cè)菀妆换煜璩叮鋵?shí)它們之間還是有區(qū)別的√吮。框架通常是代碼重用绽诚,而設(shè)計(jì)模式是設(shè)計(jì)重用,架構(gòu)則介于兩者之間杭煎,部分代碼重用恩够,部分設(shè)計(jì)重用,有時分析也可重用羡铲。在軟件生產(chǎn)中有三種級別的重用:內(nèi)部重用蜂桶,即在同一應(yīng)用中能公共使用的抽象塊;代碼重用,即將通用模塊組合成庫或工具集也切,以便在多個應(yīng)用和領(lǐng)域都能使用扑媚;應(yīng)用框架的重用檐盟,即為專用領(lǐng)域提供通用的或現(xiàn)成的基礎(chǔ)結(jié)構(gòu),以獲得最高級別的重用性。

框架與設(shè)計(jì)模式雖然相似节猿,但卻有著根本的不同太雨。設(shè)計(jì)模式是對在某種環(huán)境中反復(fù)出現(xiàn)的問題以及解決該問題的方案的描述,它比框架更抽象;框架可以用代碼表示,也能直接執(zhí)行或復(fù)用,而對模式而言只有實(shí)例才能用代碼表示;設(shè)計(jì)模式是比框架更小的元素,一個框架中往往含有一個或多個設(shè)計(jì)模式,框架總是針對某一特定應(yīng)用領(lǐng)域,但同一模式卻可適用于各種應(yīng)用。可以說峡迷,框架是軟件,而設(shè)計(jì)模式是軟件的知識。

框架模式有哪些尖阔?

MVC块茁、MTV佩耳、MVP蛮瞄、CBD籍凝、ORM等等退盯;

框架有哪些琉朽?

C++語言的QT算色、MFC若河、gtk炭庙,Java語言的SSH 、SSIphp語言的 smarty(MVC模式)做鹰,python語言的django(MTV模式)等等

設(shè)計(jì)模式有哪些献宫?

工廠模式適配器模式庶柿、策略模式等等

簡而言之:框架是大智慧搅轿,用來對軟件設(shè)計(jì)進(jìn)行分工黎茎;設(shè)計(jì)模式是小技巧串远,對具體問題提出解決方案,以提高代碼復(fù)用率,降低耦合度彪标。

4. Unity3D中怎么用:

4.1 直接套用模式

image.png

image.png

image.png

image.png

4.2 創(chuàng)新改進(jìn)的M-V-MV-E(Modle-View-ModleView-Event)

image.png

4.2.1 解決一個Modle對應(yīng)多個View問題

對于游戲開發(fā)而言衙四,View存在多份是很正常的惦界,例如一份好友列表的數(shù)據(jù)桑腮,可以在好友面板展示搁骑,也可以在聊天面板展示,還可以在內(nèi)容分享列表中展示又固。
所以是一份數(shù)據(jù)仲器,對應(yīng)多個View,所以這里可以用任何一個MVX(MVC仰冠,MVP乏冀,MVVM),都可以實(shí)現(xiàn)洋只。都是一份數(shù)據(jù)Modle對應(yīng) 多個View辆沦。

4.2.2 解決View復(fù)用的問題

而很多情況下,比如一個列表的展示识虚,View的實(shí)現(xiàn)也大致相似肢扯,因此可以抽象出ModelView,可復(fù)用大量的view邏輯担锤。因此可以用MVVM模式蔚晨。

4.2.3 解決游戲中多模塊耦合,數(shù)據(jù)統(tǒng)一管理的問題

由于游戲中肛循,無論是弱聯(lián)網(wǎng)單機(jī)游戲還是實(shí)時網(wǎng)絡(luò)游戲铭腕,數(shù)據(jù)都來源于服務(wù)器,因此一定有個集中處理收發(fā)數(shù)據(jù)的地方多糠,可以叫做DataProcessCenter累舷,數(shù)據(jù)的改變,都是通過這個DataProcessCenter作為橋梁鏈接Server和Client熬丧。
而既然已經(jīng)有了DataProcessCenter笋粟,MVX中的Modle就已經(jīng)有了怀挠,無非是析蝴,各子模塊中獨(dú)立維護(hù)害捕,還是DataProcessCenter統(tǒng)一維護(hù)。但無論是哪一種闷畸,都可以通過Event來解耦尝盼,這個可以理解成 消息-發(fā)布模式,或者觀察者模式佑菩,訂閱數(shù)據(jù)改變盾沫,并形成變化。

【參考1:https://zhuanlan.zhihu.com/p/157273459
【參考2:https://www.zhihu.com/question/20148405/answer/23813147
【參考3:https://blog.csdn.net/leehuimr/article/details/116298737

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末殿漠,一起剝皮案震驚了整個濱河市赴精,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绞幌,老刑警劉巖蕾哟,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異莲蜘,居然都是意外死亡谭确,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門票渠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逐哈,“玉大人,你說我怎么就攤上這事问顷“和海” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵杜窄,是天一觀的道長肠骆。 經(jīng)常有香客問我,道長羞芍,這世上最難降的妖魔是什么哗戈? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮荷科,結(jié)果婚禮上唯咬,老公的妹妹穿的比我還像新娘。我一直安慰自己畏浆,他們只是感情好胆胰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刻获,像睡著了一般蜀涨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天厚柳,我揣著相機(jī)與錄音氧枣,去河邊找鬼。 笑死别垮,一個胖子當(dāng)著我的面吹牛便监,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碳想,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼烧董,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胧奔?” 一聲冷哼從身側(cè)響起逊移,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎龙填,沒想到半個月后胳泉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡觅够,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年胶背,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喘先。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡钳吟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窘拯,到底是詐尸還是另有隱情红且,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布涤姊,位于F島的核電站暇番,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏思喊。R本人自食惡果不足惜壁酬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恨课。 院中可真熱鬧舆乔,春花似錦、人聲如沸剂公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纲辽。三九已至颜武,卻和暖如春璃搜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳞上。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工这吻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人因块。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓橘原,卻偏偏與公主長得像籍铁,于是被迫代替她去往敵國和親涡上。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容