MVC模式原理
MVC
,即Model-View-Controller
蚜枢,意味:模型缸逃、視圖和控制器针饥。
-
Model
- 程序需要操作的數(shù)據(jù)來(lái)源。通常是從數(shù)據(jù)庫(kù)需频、網(wǎng)絡(luò)請(qǐng)求或者是
Bean
數(shù)據(jù)丁眼。 - 負(fù)責(zé)提供數(shù)據(jù)
- 程序需要操作的數(shù)據(jù)來(lái)源。通常是從數(shù)據(jù)庫(kù)需频、網(wǎng)絡(luò)請(qǐng)求或者是
-
View
- 程序用來(lái)展示內(nèi)容的界面。通常是
Activity
贺辰、Fragment
等UI
組件户盯。 - 負(fù)責(zé)展示數(shù)據(jù)
- 程序用來(lái)展示內(nèi)容的界面。通常是
-
Controller
- 程序中用于處理
Model
數(shù)據(jù)業(yè)務(wù)邏輯并將結(jié)果輸送給View
的中間層嵌施。 - 負(fù)責(zé)處理業(yè)務(wù)邏輯
- 程序中用于處理
MVC模式流程.png
實(shí)際開(kāi)發(fā)中
Activity
究竟算Controller
還是View
說(shuō)不清楚饲化。理論上Activity
是UI
組件負(fù)責(zé)展示內(nèi)容,但很多項(xiàng)目中Activity
處理了太多的業(yè)務(wù)邏輯操作吗伤。超過(guò)1000
行代碼太常見(jiàn)了吃靠。根據(jù)這種情況我將Activity
放到Controller
上。只是個(gè)人習(xí)慣而已足淆!
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
- 耦合性低:視圖層和業(yè)務(wù)層分離巢块。
- 重用性高:多個(gè)
View
能共享同一個(gè)Model
。 - 部署快:責(zé)任分離巧号,各司其職族奢,職責(zé)清晰。
- 可維護(hù)性高
- 缺點(diǎn)
-
Controller
角色比重太大丹鸿。雖然擔(dān)任控制器的職責(zé)越走,但現(xiàn)實(shí)開(kāi)發(fā)中類似Activity
的UI
卻做了很多View
相關(guān)操作。VC
分離不清靠欢。 - 優(yōu)點(diǎn)中的耦合性低是相對(duì)的廊敌,現(xiàn)實(shí)中
MVC
的耦合性確實(shí)不低!
-
MVP模式原理
知道了MVC
的不足之處门怪,MVP
就是為了解決VC
耦合這個(gè)問(wèn)題骡澈,在MVC
的基礎(chǔ)上變種出來(lái)的框架。
M
幾乎沒(méi)有變化掷空,只是把VC
抽出來(lái)變成了VP
肋殴。
MVP
核心思想:
MVP
把Activity
中的UI
邏輯抽象成View
接口,把業(yè)務(wù)邏輯抽象成Presenter
接口坦弟,Model
類還是原來(lái)的Model
疼电。
減輕了Activity
的工作,因?yàn)榇蟛糠止ぷ鞫紒G到了Presenter
那去了减拭。自己只要管理好生命周期即可蔽豺。
MVP模式.png
根據(jù)上圖,代碼所需的實(shí)現(xiàn):
- 創(chuàng)建
IPresenter
表示業(yè)務(wù)邏輯接口拧粪,由PresenterImpl
實(shí)現(xiàn) - 創(chuàng)建
IView
接口表示UI
邏輯實(shí)現(xiàn)修陡,由Activity
沧侥、Fragment
等UI
組件實(shí)現(xiàn) -
Activity
關(guān)聯(lián)PresenterImpl
用于調(diào)用業(yè)務(wù)方法 -
PresenterImpl
關(guān)聯(lián)Activity
用于調(diào)用UI
方法 -
Model
木有變化,還是原來(lái)的Model
~?(?*)
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
- 結(jié)構(gòu)清晰魄鸦,比
MVC
要清晰多了
- 結(jié)構(gòu)清晰魄鸦,比
- 缺點(diǎn)
- 每個(gè)
View
都有個(gè)Presenter
宴杀,多了也是個(gè)麻煩~
- 每個(gè)
MVVM模式原理
MVVM
模式利用了一個(gè)工具DataBinding
實(shí)現(xiàn)了其中的VM
。將數(shù)據(jù)和View
綁定在一起拾因,這樣一來(lái)旺罢,數(shù)據(jù)發(fā)生改變,View
會(huì)即時(shí)更新绢记。
-
Model
-
Model
還是原來(lái)的Model
扁达,負(fù)責(zé)提供實(shí)體模型。供VM
使用蠢熄。
-
-
View
-
Activity
跪解、Fragment
以及View
組件,這一塊只包含UI
相關(guān)代碼签孔。不含有一點(diǎn)業(yè)務(wù)邏輯代碼叉讥。 - 這才是真正的
View
模塊,View
模塊就應(yīng)該只負(fù)責(zé)UI
邏輯饥追。
-
-
ViewModel
- 只負(fù)責(zé)業(yè)務(wù)邏輯
- 將
Model
提供的實(shí)體數(shù)據(jù)和View
中真正展示數(shù)據(jù)的UI組件通過(guò)DataBinding
綁定在一起图仓。 - 我們就不用像以前那樣,等
Bean
改變后但绕,get
里面的屬性值救崔。然后獲取UI
組件的引用,將屬性值設(shè)置到UI
組件上壁熄。 -
VM
綁定在一起帚豪,Model
一改變,View
自動(dòng)實(shí)時(shí)更新草丧!
MVVM模式.png
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
-
雙向綁定技術(shù)狸臣,
Model
變化,View
自動(dòng)更新昌执≈蛞啵或者說(shuō),Model
變化懂拾,ViewModel
和View
自動(dòng)更新(角度不一樣而已)煤禽。 - 模塊之間職責(zé)更清晰。
- 控制器功能大都到了
View
上岖赋,大大減輕壓力檬果。
-
雙向綁定技術(shù)狸臣,
- 缺點(diǎn)
-
DataBinding
后很難進(jìn)行調(diào)試,出現(xiàn)問(wèn)題很難進(jìn)行定位。 - 大項(xiàng)目中
Model
會(huì)很大选脊,長(zhǎng)期占有不能釋放會(huì)占內(nèi)存杭抠。 -
View
的重用性降低,MVVM
中的一個(gè)View
綁定一個(gè)Model
恳啥。不同模塊的View
都不同偏灿,重用困難。
-