不必糾結MVC還是MVP了,聽我說兩句~

MVC全稱是Model-View-Controller 也就是模型–視圖–控制器。是在1970年的時候提出由TrygveReenskaug在Smalltalk-80系統上首次提出的。MVP是MVC的一個演化版本,全稱是Model-View-Presenter。MVP的出現主要就是解決MVC中的View和Model的耦合性高的的問題,同時又帶來了很好的擴展性。

學習Android的同學注意了!!!

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Android學習交流羣,羣號碼:364595326  我們一起學Android!

MVC全稱是Model-View-Controller 也就是模型–視圖–控制器。是在1970年的時候提出由TrygveReenskaug在Smalltalk-80系統上首次提出的。

SmallTalk在百度百科的解釋是這樣:

Smalltalk被公認爲歷史上第二個面向對象的程序設計語言和第一個真正的集成開發環境 (IDE)。

來張圖說明一下MVC的工作模式吧

1240

圖中紅色小框框就是MVC的工作模式

從圖中可以看出用戶向View發送指令,再有View直接要求Modle改變狀態

用戶也可以直接向Controller發送指令,再由Controller發送給Model,在通過Model去改變View的狀態

所以MVC框架模式View和Model之間的聯繫還是相當緊密的,耦合度還是很高,後期維護改動View需要將Model中的內容也要改動。

MVC是一種框架模式而非設計模式

其優點是:

理解起來比較容易,技術含量並不高,對開發和維護來說易於維護和修改

耦合度不高,表現層與業務層分離,各司其職。

其缺點是:

它定義不是很明確,完全理解MVC模式並不容易。

使用MVC需要精心策劃,因爲你它的內部原理比較複雜

一些小的項目採用MVC框架反而會更加複雜

MVC的Android僞代碼實現

以下圖片中代碼與數據不匹配,只是爲了方便理解MVC在代碼中如何寫,需要看實例的可以去網上了解,我在這裏就偷懶了:)

首先你需要一個View視圖,也就是XML佈局。

1240

然後你還需要一個Model

也就是數據,可以是數據庫中的內容,也可以是在代碼中寫的List集合。

1240

最後需要一個Controller,也就是Activity或者Fragment

通過在Controller中對用戶在View中傳遞過來的操作,進行訪問model中的數據,然後改變View中的狀態。

1240

MVP是MVC的一個演化版本,全稱是Model-View-Presenter。

MVP的出現主要就是解決MVC中的View和Model的耦合性高的的問題,同時又帶來了很好的擴展性。

MVP模式的三個角色的作用:

Presenter-中介

主演溝通View和Model的橋樑,他從Model獲取數據後返回給View層,是的View層和Model層之間沒有耦合,從而獎業務邏輯從View層抽離。

Model-房主

Model主要提供數據的存取功能,Presenter需要通過Model層存儲、獲取數據,Model層就像是一個倉庫。

View-用戶

View通常是指Activity、Fragment或者某個View控件。它含有一個Presenter成員變量,同時它需要實現一個邏輯接口,獎View上的操作轉交割Presenter進行實現,最後Presenter調用View邏輯接口將結果返回給View元素。

來張圖說明一下MVP的工作模式吧

1240

從圖中我們可以看出MVP和MVC之間的額最大區別:

VIew和Model之間徹底的解耦

MVP是面向接口編程,也就是說用戶不必知道我是具體如何實現額,用戶只要知道有這個功能,直接調用即可。

MVP的Android僞代碼實現

以下圖片中代碼與數據不匹配,只是爲了方便理解MVC在代碼中如何寫,需要看實例的可以去網上了解,我在這裏就偷懶了:)

首先需要一個Presenter,作爲View和Model的中間人

1240

然後你還需要一個View以及ViewImpl接口

1240

1240

最後你還需要Model一個ModelImpl接口

1240

爲什麼說不必糾結是MVC還是MVP呢?

MVC和MVP的最終目的就是要數據和UI分離,互相不影響。那麼如何能不必糾結而做到呢??你聽說過面向對象嗎?聽過再聽聽我的理解~

面向對象

封裝、多態,繼承。老師好像也都是這麼教的,那麼到底說明是多態封裝繼承呢?

封裝

封裝就是將用戶不想看到的東西封裝起來,可以用到面向對象中的 Private

屬性,將用戶不想看到的內容寫在這裏面。比如收音機上的播放功能,用戶不用知道收益及如何播放,它只需要知道摁下這個鍵能播放即可。

多態

多態就是一個對象的多種表現形態,主要表現爲:行爲多態和狀態多態。

行爲多態就好比一個父親有多個孩子,每個孩子都不一樣,但是都是同一個父親;狀態多態就好比每個孩子在一天中有好多個狀態變現,有吃飯,學習,睡覺。

繼承?不!我想說的是對象!

我的一個朋友告訴我繼承其實是對面向對象的最大誤解。繼承我們可以理解成一個對象他有多個小對象組成;比如人這個對象是由手腳,腦袋…等其它小對象組成。因此繼承我們可以不去記住,我們只要對每個對象有深刻的認識即可把對象描述清楚!

那麼MVC、MVP與面向對象有什麼關係呢??

首先MVC和MVP都是要求數據和UI之間互不影響,那麼面向對象不就是嗎!?

面向對象View?

對象也就是我們說的用戶也就是MC或者MVP中View,用戶需要什麼我們就展示給其什麼,不需要的我們將其封裝起來提供一個方法給你調用即可,這是不是和MVC或者MVP中很像!

面向對象Model?

同時面向對象也是需要將對象的行爲細分,比如人可以跑,可以游泳…這是不是和MVC中的Model一樣,需要處理用戶不同的操作。

面向對象Controller?

最後面向對象也是需要一個狀態去控制的,比如人的大腦。通過大腦去協調手和腳的平衡。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章