架構(gòu)思維系列之MVP架構(gòu)

MVP架構(gòu)

什么是MVP

MVP是MVC的變種,其中Model和View的定義與MVC的一致故黑,不同點(diǎn)在于:MVC的Controller是管理一組Model與View之間交互邏輯呐籽,是一個(gè)管理者袭艺;而Presenter(展示者)則是Model于View之間的連接者滑绒,針對(duì)特定模塊的View提供對(duì)應(yīng)的格式化的Model數(shù)據(jù)权她,將View中的行為反饋到Model中。所以MVC中的Controller一般會(huì)管理一個(gè)或多個(gè)Model和一個(gè)或多個(gè)View刀森,而Presenter則是 M-P-V 一對(duì)一踱启,有更細(xì)的粒度和更好的解耦。是針對(duì)有GUI存在的應(yīng)用程序研底,目的在于埠偿,對(duì)于GUI層來(lái)說(shuō),把UI展示與邏輯分開(kāi)榜晦。

mvc-vs-mvp.jpg

<pre>

  • (最主要區(qū)別)View與Model并不直接交互冠蒋,而是通過(guò)與Presenter交互來(lái)與Model間接交互。而在MVC中View可以與Model直接交互
  • 通常View與Presenter是一對(duì)一的乾胶,但復(fù)雜的View可能綁定多個(gè)Presenter來(lái)處理邏輯抖剿。而Controller是基于行為的朽寞,并且可以被多個(gè)View共享,Controller可以負(fù)責(zé)決定顯示哪個(gè)View
  • Presenter與View的交互是通過(guò)接口來(lái)進(jìn)行的斩郎,更有利于添加單元測(cè)試脑融。
    </pre>

MVP結(jié)構(gòu)圖

MVP-struct.png

MVP變種:Passive View

在這種模式下,View和Model之間不能直接交互缩宜,View通過(guò)Presenter與Model打交道肘迎。Presenter接受View的UI請(qǐng)求,完成簡(jiǎn)單的UI處理邏輯锻煌,并調(diào)用Model進(jìn)行業(yè)務(wù)處理妓布,并調(diào)用View將相應(yīng)的結(jié)果反映出來(lái)。View直接依賴(lài)Presenter宋梧,但是Presenter間接依賴(lài)View匣沼,它直接依賴(lài)的是View實(shí)現(xiàn)的接口。

組成

  • (1)View:負(fù)責(zé)繪制UI元素乃秀、與用戶(hù)進(jìn)行交互;
  • (2)View interface:需要View實(shí)現(xiàn)的接口肛著,View通過(guò)View interface與Presenter進(jìn)行交互,降低耦合跺讯,方便進(jìn)行單元測(cè)試;
  • (3)Model:負(fù)責(zé)存儲(chǔ)枢贿、檢索、操縱數(shù)據(jù)(有時(shí)也實(shí)現(xiàn)一個(gè)Model interface用來(lái)降低耦合)刀脏,為UI層提供的數(shù)據(jù)局荚,或者保存UI層傳下來(lái)的數(shù)據(jù);
  • (4)Presenter:作為View與Model交互的中間紐帶,處理與用戶(hù)交互的負(fù)責(zé)邏輯愈污;邏輯控制層耀态,從Model處取數(shù)據(jù),運(yùn)算和轉(zhuǎn)化暂雹,最后用View來(lái)展示首装;并處理View傳過(guò)來(lái)的用戶(hù)事件,并做處理杭跪。
    因此仙逻,Presenter 層是連接 Model 層和 View 層的中間層,因此持有 View 層的接口和 Model 層的接口涧尿。

<code>
接口的作用類(lèi)似給層與層之間制定的一種通信協(xié)議系奉,兩個(gè)不同的層級(jí)相互交流,只要遵守這些協(xié)議即可姑廉,并不需要知道具體的實(shí)現(xiàn)是怎樣
</code>

規(guī)則

  • Model與View不能直接通信缺亮,只能通過(guò)Presenter
  • Presenter類(lèi)似于中間人的角色進(jìn)行協(xié)調(diào)和調(diào)度
  • Model和View是接口,Presenter持有的是一個(gè)Model接口和一個(gè)View接口
  • Model和View都應(yīng)該是被動(dòng)的桥言,一切都由Presenter來(lái)主導(dǎo)
  • Model應(yīng)該把與業(yè)務(wù)邏輯層的交互封裝掉萌踱,換句話(huà)說(shuō)Presenter和View不應(yīng)該知道業(yè)務(wù)邏輯層
  • View的邏輯應(yīng)該盡可能的簡(jiǎn)單葵礼,不應(yīng)該有狀態(tài)。當(dāng)事件發(fā)生時(shí)并鸵,調(diào)用Presenter來(lái)處理章咧,并且不傳參數(shù),Presenter處理時(shí)再調(diào)用View的方法來(lái)獲取能真。

MVP優(yōu)點(diǎn)

  • 模型與視圖完全分離,我們可以修改視圖而不影響模型扰柠;同時(shí)粉铐,高效的使用模型,所有的交互發(fā)生在 Presenter內(nèi)部
  • View和Model抽象成為接口
  • 代碼更加容易移植
  • 代碼更加容易加入U(xiǎn)nit Testing

MVP深入思考

對(duì)于 Presenter 的設(shè)計(jì)卤档,或者說(shuō)具體應(yīng)該把哪些內(nèi)容放到 Presenter 中蝙泼,是一個(gè)關(guān)鍵。Model 并不是必須有的劝枣;如果帶有 Model汤踏,則 Presenter 要實(shí)現(xiàn) Model 的回調(diào),在回調(diào)中把數(shù)據(jù)傳給 View 或響應(yīng)舔腾。所以 Presenter 必須得有 View 的引用溪胶,但可以不用 Model.

參考文章

1.Andriod MVP架構(gòu)

http://toughcoder.net/blog/2015/11/29/understanding-android-mvp-pattern/

2.Google Andriod架構(gòu)藍(lán)圖

https://github.com/googlesamples/android-architecture

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稳诚,隨后出現(xiàn)的幾起案子哗脖,更是在濱河造成了極大的恐慌,老刑警劉巖扳还,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件才避,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡氨距,警方通過(guò)查閱死者的電腦和手機(jī)桑逝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俏让,“玉大人楞遏,你說(shuō)我怎么就攤上這事∮呤唬” “怎么了橱健?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)沙廉。 經(jīng)常有香客問(wèn)我拘荡,道長(zhǎng),這世上最難降的妖魔是什么撬陵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任珊皿,我火速辦了婚禮网缝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蟋定。我一直安慰自己粉臊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布驶兜。 她就那樣靜靜地躺著扼仲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抄淑。 梳的紋絲不亂的頭發(fā)上屠凶,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音肆资,去河邊找鬼矗愧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛郑原,可吹牛的內(nèi)容都是我干的唉韭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼犯犁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼属愤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起酸役,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤春塌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后簇捍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體只壳,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年暑塑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吼句。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡事格,死狀恐怖惕艳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驹愚,我是刑警寧澤远搪,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站逢捺,受9級(jí)特大地震影響谁鳍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一倘潜、第九天 我趴在偏房一處隱蔽的房頂上張望绷柒。 院中可真熱鬧,春花似錦涮因、人聲如沸废睦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嗜湃。三九已至,卻和暖如春澜掩,著一層夾襖步出監(jiān)牢的瞬間净蚤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工输硝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人程梦。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓点把,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屿附。 傳聞我的和親對(duì)象是個(gè)殘疾皇子郎逃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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