1. 程式人生 > >關於MVC,MVP,MVVM的一點總結和思考

關於MVC,MVP,MVVM的一點總結和思考

##簡介
軟體的架構方式有很多種,從最開始的MVC模式,演化到MVP,然後到現在的MVVM,在不斷的演化過程中其核心的思想就是降低各元件之間的耦合度,使得資料的流向更加的清晰明瞭。但並不是意味著一個比另一個高階,只是對於軟體的架構方式有的不同的視角,針對不同的場景有了更多的選擇方案。在學習過程中通過對三種架構方式的比對和思考,可以很好的幫助我們提高對於軟體架構的理解,以下只是自己學習過程中的一點總結和反思,由於水平有限,有意見或者是觀點請各位看官指正。

##什麼是架構

在談具體的架構之前我們需要先明白什麼叫做架構,而他們又有什麼作用,為什麼會被廣泛的使用。個人對於這個問題是這樣認為的:架構就像是一個人的骨骼一樣,或者是像是機器人的整體框架一樣,他決定了之後所有的操作是基於一種什麼樣的方式上展開的,就像是樂高積木一樣。

以機器人為例,最簡單的機器人就是各個模組之間相互焊接組成的,將四肢焊接到軀幹的電路板上,這樣就會產生一個問題。就是當某一個部位損壞時需要將對應部位替換,但是由於所有的連線點都是直接焊死的,所以在後期的維修過程中很麻煩。但是若是我們在設計初期就將所有的連線點設計成即插即用的介面,那麼當有零件損壞時,只需要將損壞的零件拔下,然後用新的零件直接替換就好,這樣的設計無疑是更加科學合理的。

在軟體開發過程中也是一樣的,架構其實就是之前例子中的不同的焊接方式,不同的架構可以使我們有著不同的組織軟體的方式,並不一定是說哪一個最好,而是根據其使用的場景來選擇最為合適的架構方式。選用合適的架構,可以有助我們實現軟體的合理分層,降低耦合度,便於後期的維護和拓展。

##MVC(Model,View,Control)

較為傳統和成熟的一種架構方式,最核心的就是通過Control層來進行調控,所有的排程都是由Control來進行處理。其核心的策略簡示如下:

圖示
可以看到在這種模式中,Control處於中間核心地位,同時三者之間是兩兩都有聯絡的。這種模式在JavaEE中的SSH框架體現的很好,頁面展示(View)使用JSP和Struct,同時將業務邏輯的處理(Control)交給具體的Action,然後Action會通過對應的DAO層(Model)來進行資料的更新,然後再將更新的資料返回給Action,Action根據DAO層的返回來控制頁面的跳轉。這就很好的將整個軟體實現了分層,下層為上層提供服務的介面,而上層對下層進行彙總呼叫。這就是MVC框架的直觀體現,可以很好的將軟體架構進行分層,降低了耦合度。

而在Android中,Model主要包括對於資料的增刪改查操作,伺服器資料的拉取等這些和資料相關的工作,View主要包括各種元件和自定義的View,Control則主要是Activity。但是有一個問題就是,由於Activity同時也需要承載View,處理UI檢視的變化,但是同時也需要處理業務邏輯,這樣的話Activity就會顯得很臃腫,在後期閱讀起來會很困難,同時對於它的定位也就很模糊。程式碼就會有很高的耦合性,在後期的維護中也就很困難。

###優缺點:

  • **優點:**優點是對於混亂的軟體組織方式有了一個明確的組織方式,通過Control來掌控全域性,同時將View展示和Model的變化分離開。

  • **缺點:**從圖示中也可以看出,在View和Model之間是直接進行互動的,也就是說View和Model之間是可以相互產生影響的,這樣在程式碼中就必然會導致View和Model之間的耦合。

##MVP(Model,View,Presenter)

MVC架構方式的變種,使用Presenter來代替Control,而且改變了資料的流向,View和Model之間不再直接進行互動,而是全部通過Presenter來進行。
圖示

則MVP架構中,Presenter同時持有View和Model,同時View和Model中也各自含有對於Presenter的引用。當View中的檢視改變,需要更新資料時,通過Presenter來通知Model來進行資料更新,同樣的當資料發生更新時,也通過其自身含有的額Presenter引用來通知View來進行更新。這樣Presenter就可以作為橋樑來聯絡兩者,而傳統的Activity只需要進行UI的繪製,呈現即可。

###優缺點:

  • **優點:**優點是可以是得整個軟體分層清晰,降低耦合度,同時也將Activity從既是Control又是View的境地中解脫出來,只需要單一的負責UI即可,降低了Activity的任務

  • **缺點:**缺點是需要加入Presenter來作為橋樑協調View和Model,同時也會導致Presenter變得很臃腫,在維護時比較不方便。而且對於每一個Activity,基本上均需要一個對應的Presenter來進行對應。

##MVVM(Model,View,ViewModel)

關於MVVM的詳細可以閱讀我之前的一篇關於MVVM的是個實現框架的的文章Google官方支援的MVVM架構框架DataBinding使用入門但是這只是Google推出的實現MVVM架構的一個框架,並不是說MVVM就只是DataBinding

圖示

MVVM其實是對MVP的一種改進,他將Presenter替換成了ViewModel,並通過雙向的資料繫結來實現檢視和資料的互動。也就是說只需要將資料和檢視繫結一次之後,那麼之後當資料發生改變時就會自動的在UI上重新整理而不需要我們自己進行手動重新整理。在MVVM中,他儘可能的會簡化資料流的走向,使其變得更加簡潔明瞭。

###優缺點:

  • **優點:**可以使得資料流的走向更加的清晰明瞭,同時也簡化了開發,資料和檢視只需要進行一次繫結即可。
  • **缺點:**目前這種架構方式的實現方式比較不完善規範,常見的就是DataBinding框架

##關於三種模式的其他文章: