由MVC談到MVVM鳞贷、MVP及項目重構

MVC設計模式
是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創(chuàng)建 Web 應用程序的模式:Model(模型)表示應用程序核心(比如數據庫記錄列表)、View(視圖)顯示數據(數據庫記錄)、Controller(控制器)處理輸入(寫入數據庫記錄)是一種設計模式根據項目具體需求確定是否使用嫩舟。

![MVC設計模式](http://ogpt2m9nl.bkt.clouddn.com/MVC 上午9.44.27 上午9.45.30.png)

用戶在View上觸發(fā)通過Controller處理業(yè)務用于更新數據,數據更新后發(fā)送消息用于改變顯示或Controller直接反饋用戶怀偷。在MVC基礎上為了更好的復用(高內聚低耦合)降低View與Model的耦合家厌,從而進行改進:

優(yōu)化后
優(yōu)化后

看起來是不是很像MVP?
同樣的切斷了View與Model的聯(lián)系,Controller/Presenter負責邏輯的處理枢纠,Model提供數據像街,View負責顯示。在MVP里晋渺,Presenter完全把Model和View進行了分離,主要的程序邏輯在Presenter里實現(xiàn)脓斩。而且木西,Presenter與具 體的View是沒有直接關聯(lián)的,而是通過定義好的接口進行交互随静,從而使得在變更View時候可以保持Presenter的不變八千,即重用。這段描述摘自

MVP的優(yōu)點:

  1. 模型與視圖完全分離燎猛,我們可以修改視圖而不影響模型恋捆;
  2. 可以更高效地使用模型,因為所有的交互都發(fā)生在一個地方——Presenter內部重绷;
  3. 我們可以將一個Presenter用于多個視圖沸停,而不需要改變Presenter的邏輯。這個特性非常的有用昭卓,因為視圖的變化總是比模型的變化頻繁愤钾;
  4. 如果我們把邏輯放在Presenter中瘟滨,那么我們就可以脫離用戶接口來測試這些邏輯(單元測試)。

改進后降低了View與Controller的耦合能颁,所有的消息處理交給Controller杂瘸。這是種非常理想的狀態(tài),明顯優(yōu)于原始的MVC伙菊。但在實際開發(fā)中所有View與Model交互通過Controller后會造成Controller上邏輯過于復雜代碼臃腫败玉。

在此基礎上我們繼續(xù)優(yōu)化參考objc.io

  • 將TableView的DataSource分離出來
  • 將網絡請求和Model轉換分離到另外一個類中
  • 將拼裝復用的控件拆分到另一個類中

如何得到的上述結論?

很多設計模式都遵循共同的特點“可維護”镜硕,對于View及Model來說绒怨,如果抽象的好、封裝的好谦疾,就可以隨意哪類復用南蹂,也便于維護。Model是業(yè)務數據如果可以在同一個項目內也可以復用念恍。而Controller中包含網絡請求六剥、數據處理、以及交互邏輯無法復用且臃腫峰伙。所以在MVC的基礎上我們可以針對“腫塊”“切開”重組疗疟。

  1. 針對網絡請求數據處理:
    唐巧曾介紹過將每個網絡請求抽象成單獨的類[把每一個網絡請求封裝成對象其實是使用了設計模式中的 Command 模式:將請求封裝成對象,以便使用不同的請求瞳氓、日志策彤、隊列等來參數化其他對象。命令模式也支持撤銷操作]

優(yōu)點:
* 方便更換第三方依賴庫
* 在積累中處理公共邏輯匣摘、緩存邏輯
* 方便對象持久化
* 簡化Controller邏輯

  1. 將拼裝控件抽象到專門的類中
    可復用的控件封裝店诗、
    用一個靜態(tài)類幫助拼裝、
    我們在拆分Controller的過程中對于Controller與View的傳值過程拿出來抽象音榜,便成了ViewModel庞瘸,數據庫結構往往是不能直接跟界面控件一一對應上的,所以赠叼,需要再定義一個數據對象專門對應view上的控件擦囊。而ViewModel的職責就是把model對象封裝成可以顯示和接受輸入的界面數據對象。
優(yōu)化后

看到這里是不是已經像MVVM模式了嘴办?我的理解是實際上Model-ViewModel-ViewController-View其實就是MVC基礎上將臃腫的Controller拆分開來瞬场。 在實際應用中無需拘泥于形式一定是MVC模式或者MVVM模式、MVP模式合理的搭配使用涧郊。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末贯被,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刃榨,老刑警劉巖弹砚,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枢希,居然都是意外死亡桌吃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門苞轿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茅诱,“玉大人,你說我怎么就攤上這事搬卒∩螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵契邀,是天一觀的道長摆寄。 經常有香客問我,道長坯门,這世上最難降的妖魔是什么微饥? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮古戴,結果婚禮上欠橘,老公的妹妹穿的比我還像新娘。我一直安慰自己现恼,他們只是感情好肃续,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叉袍,像睡著了一般始锚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畦韭,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天疼蛾,我揣著相機與錄音,去河邊找鬼艺配。 笑死,一個胖子當著我的面吹牛衍慎,可吹牛的內容都是我干的转唉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼稳捆,長吁一口氣:“原來是場噩夢啊……” “哼赠法!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砖织,失蹤者是張志新(化名)和其女友劉穎款侵,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體侧纯,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡新锈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眶熬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妹笆。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖娜氏,靈堂內的尸體忽然破棺而出拳缠,到底是詐尸還是另有隱情,我是刑警寧澤贸弥,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布窟坐,位于F島的核電站,受9級特大地震影響绵疲,放射性物質發(fā)生泄漏哲鸳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一最岗、第九天 我趴在偏房一處隱蔽的房頂上張望帕胆。 院中可真熱鬧,春花似錦般渡、人聲如沸懒豹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脸秽。三九已至,卻和暖如春蝴乔,著一層夾襖步出監(jiān)牢的瞬間记餐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工薇正, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留片酝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓挖腰,卻偏偏與公主長得像雕沿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子猴仑,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容