Android就業面試技巧系列-技術篇4(MVP)
阿新 • • 發佈:2019-01-24
Android就業面試技巧系列-技術篇(MVP)
MVC
(控制器Controller)- 負責轉發請求,對請求進行處理。
(檢視View) - 介面設計人員進行圖形介面設計。
(模型Model) - 程式設計師編寫程式應有的功能(實現演算法等等)、資料庫專家進行資料管理和資料庫設計(可以實現具體的功能)。
模型(Model) “資料模型”(Model)用於封裝與應用程式的業務邏輯相關的資料以及對資料的處理方法。“模型”有對資料直接訪問的權力,例如對資料庫的訪問。
“模型”不依賴“檢視”和“控制器”,也就是說,模型不關心它會被如何顯示或是如何被操作。但是模型中資料的變化一般會通過一種重新整理機制被公佈。
為了實現這種機制,那些用於監視此模型的檢視必須事先在此模型上註冊,從而,檢視可以瞭解在資料模型上發生的改變。(比較:觀察者模式)
檢視(View) 檢視層能夠實現資料有目的的顯示。在檢視中一般沒有程式上的邏輯。為了實現檢視上的重新整理功能,檢視需要訪問它監視的資料模型(Model),因此應該事先在被它監視的資料那裡註冊。
控制器(Controller) 控制器起到不同層面間的組織作用,用於控制應用程式的流程。它處理事件並作出響應。“事件”包括使用者的行為和資料模型上的改變。
MVP
MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的地方:
Controller(控制器)/Presenter(主持人、協調者)負責邏輯的處理,Model提供 資料,View負責顯示
作為一種新的模式,MVP與MVC有著一個重大的區別:在MVP中View並不直接使用Model,它們之間的通訊是通過Presenter (MVC中的Controller)來進行的,所有的互動都發生在Presenter內部,而在MVC中View會從直接Model中讀取資料而不是通過 Controller。
在MVC裡,View是可以直接訪問Model的,從而,View裡會包含Model資訊,不可避免的還要包括一些業務邏輯。 所以,在MVC模型裡,Model不依賴於View,但是View是依賴於Model的。不僅如此,因為有一些業務邏輯在View裡實現了,導致要更改View也是比較困難的,至少那些業務邏輯是無法重用的。
在MVP裡,Presenter完全把Model和View進行了分離,主要的程式邏輯在Presenter裡實現。而且,Presenter與具體的View是沒有直接關聯的,而是通過定義好的介面進行互動,從而使得在變更View時候可以保持Presenter的不變,即重用!
不僅如此,我們還可以編寫測試用的View,模擬使用者的各種操作,從而實現對Presenter的測試,而不需要使用自動化的測試工具。
我們甚至可以在Model和View都沒有完成時候,就可以通過編寫Mock Object(即實現了Model和View的介面,但沒有具體的內容的)來測試Presenter的邏輯。 在MVP裡,應用程式的邏輯主要在Presenter來實現,其中的View是很薄的一層。因此就有人提出了Presenter
First的設計模式,就是根據User Story來首先設計和開發Presenter。在這個過程中,View是很簡單的,能夠把資訊顯示清楚就可以了。在後面,根據需要再隨便更改View,而對Presenter沒有任何的影響了。 如果要實現的UI比較複雜,而且相關的顯示邏輯還跟Model有關係,就可以在View和Presenter之間放置一個Adapter。由這個 Adapter來訪問Model和View,避免兩者之間的關聯。而同時,因為Adapter實現了View的介面,從而可以保證與Presenter之間介面的不變。這樣就可以保證View和Presenter之間介面的簡潔,又不失去UI的靈活性。
在MVP模式裡,View只應該有簡單的Set/Get的方法,使用者輸入和設定介面顯示的內容,除此就不應該有更多的內容,絕不容許直接訪問Model,這就是與MVC很大的不同之處。
MVP的優點:
1、模型與檢視完全分離,我們可以修改檢視而不影響模型
2、可以更高效地使用模型,因為所有的互動都發生在一個地方——Presenter內部
3、我們可以將一個Presenter用於多個檢視,而不需要改變Presenter的邏輯。這個特性非常的有用,因為檢視的變化總是比模型的變化頻繁。
4、如果我們把邏輯放在Presenter中,那麼我們就可以脫離使用者介面來測試這些邏輯(單元測試)
MVC程式碼舉例:
模擬一個需求:首先我們要進入一個 Splash介面, Splash介面中,有一個
ProgressBar控制元件和TextView控制元件,我們判斷它是否有網路連線,如果有的話就隱藏 ProgressBar和跳轉到MainActivity如果沒有網路的話則顯示ProgressBar和TextView,TextView則提示使用者No internet。就這麼簡單的一個需求,我們看看如何用MVP模式做這個需求:
M層介面:
[Java] 純文字檢視 複製程式碼
?
M層實現:
[Java] 純文字檢視 複製程式碼
?
V層介面:
[Java] 純文字檢視 複製程式碼
?
V層實現:
[Java] 純文
1 2 3 |
public
interface
IConnectionStatus {
boolean
isOnline();
}
|
1 2 3 4 5 6 7 |
import
com.manning.androidhacks.hack020.presenter.model.IConnectionStatus;
public
class
ConnectionStatus implements
IConnectionStatus {
@Override
public
boolean
isOnline() {
return
true ;
//
這裡應該檢測是否聯網,此處先簡單的return true代替
}
}
|
1 2 3 4 5 6 |
public
interface
ISplashView {
void
showProgress();
void
hideProgress();
void
showNoInetErrorMsg();
void
moveToMainView();
}
|