不看不知道設計模式2

目前市面上使用的模式主流的有:MVC,MVP,MVVM三種。

 

MVC

mvc模式是模型,視圖,控制器三種不同功能的組合,你中有我我中有你。

 

 

如圖,實線代表方法調用,虛線代表事件通知。

MVC允許在不改變視圖的情況下改變視圖對用戶輸入的響應方式,用戶對View的操作交給了Controller處理,在Controller中響應View的事件調用Model的接口對數據進行操作,一旦Model發生變化便通知相關視圖進行更新。

View層:代表的是xml佈局、自定義控件等顯示類層級

Controllr層;代表的是activity、fragment等,主要處理接收點擊事件,生成Model層對象等工作

Model層:代表數據操作數據對象等

如簡單的網易新聞客戶端,設計爲MVC模式時,界面的xml佈局屬於V層,activty、fragment數據Controller層,接收網絡數據及處理是Model層;當用戶點擊,事件input到controller處理,然後控制View刷新;或者當用戶滑動加載跟多數據時,Controller通知Model層,Model層進行網絡請求,加載更多的數據,然後通過Model層操作View層進行數據刷新,更新UI

這樣的設計比較直觀,各層之間有變化都可以用最近的方式通知到對應層並進行更新;但是也存在很多問題:

1、M/V/C層相互依賴,代碼耦合性太高

2、難以分工,無法將M/V/C的功能分別給不同的人寫

3、關聯太強難以維護、難以單元測試

 

MVP

MVP(Model-View-Presenter)是MVC模式的改良。和MVC的相同之處在於:Controller/Presenter負責業務邏輯,Model管理數據,View負責顯示。

 

 

 

雖然在MVC裏,View是可以直接訪問Model的,但MVP中的View並不能直接使用Model,而是通過爲Presenter提供接口,讓Presenter去更新Model,再通過觀察者模式更新View。

與MVC相比,MVP模式通過解耦View和Model,完全分離視圖和模型使職責劃分更加清晰;由於View不依賴Model,可以將View抽離出來做成組件,它只需要提供一系列接口提供給上層操作。

View層:代表的是xml佈局、activity、fragment等

Presenter層;ActivityPresenter、FragmentPresenter等作爲View層與Model層之間交互的紐帶

Model層:代表數據操作數據對象等

以美團外賣爲例:Model中的數據對象bean包、網絡處理net包、數據庫的dao包,作用爲數據的存儲和加載;通過FragmentPresenter爲紐帶將加載的數據刷新到View層的activity和fragment;用戶的點擊滑動等點單退單事件,通過Presenter爲紐帶交給Model層將數據保存到本地數據庫及上傳服務器。

優點:

1、View層和Model層都獨立出來,實現完全解耦,可以分別進行擴展,相互的影響性小,便於維護和測試

2、部分activity、fragment的邏輯放在P層處理,減少了activity和fragment的臃腫

缺點:

1、所有的處理幾乎都要經過P層,部分P層還要處理activity的邏輯,可能帶來P層臃腫

 

MVVM

MVVM(Model-View-ViewModel)最早由微軟提出。ViewModel指 "Model of View"——視圖的模型。這個概念曾在一段時間內被前端圈熱炒,以至於很多初學者拿jQuery和Vue做對比...

 

 

MVVM把View和Model的同步邏輯自動化了。以前Presenter負責的View和Model同步不再手動地進行操作,而是交給框架所提供的數據綁定功能進行負責,只需要告訴它View顯示的數據對應的是Model哪一部分即可。

核心就是把原來P層手動處理的操作交給框架處理,由框架DataBinding 自動完成數據綁定。實現過程參照:https://www.jianshu.com/p/f9d6677a88f4, 

優點:

簡單快捷,更加實用,app就是要處理界面View和數據Model,現在也只有處理這兩個層。

缺點:

1、由於中間層直接由綁定完成了,數據綁定使得 Bug 很難被調試,你看到界面異常了,有可能是你 View 的代碼有 Bug,也可能是 Model 的代碼有問題。數據綁定使得一個位置的 Bug 被快速傳遞到別的位置,要定位原始出問題的地方就變得不那麼容易了。

2、一個大的模塊中,model也會很大,雖然使用方便了也很容易保證了數據的一致性,當時長期持有,不釋放內存,就造成了花費更多的內存。

 

 

 

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