MVP模式
引言
由於在android中,MVC模式中的C承擔了C和V的作用,導致C中的程式碼十分混亂,難以閱讀。現在MVP模式目前在android應用程式中被廣泛使用,主要由於:
MVP優勢
- MVP模式將檢視和業務邏輯相分離,減輕了C的負擔,降低了耦合。
- 檢視和業務邏輯的程式碼被分別抽取到Model和Presenter中,曾經的C層變得簡潔,提高了程式碼的可閱讀性。
- 業務程式碼被抽取到Presenter中,方便了單元測試。
- 業務程式碼被抽取到Presenter中,避免了後臺執行緒引用Activity或fragment,造成記憶體洩漏。
MVP的UML圖
程式碼實現
為了除錯方便,並未在android程式中書寫,但whatever,重要的是思想。
在閱讀程式碼之前,首先明確一下,MVP中的M、V、P的職責分別是什麼。
- M即Model層,它負責定義獲取資料的操作介面。
- V即View層,它負責介面中顯示資料的操作。
- P即Presenter層,它負責呼叫Model層中定義的方法並進行實現。
下面是程式碼的結構圖:
//model層介面,實現該介面的類負責實際的資料獲取操作
public interface IModel {
void getData(Model.LoadDataCallback callback);
}
複製程式碼
//實現IModel的介面,負責資料的獲取操作
public class Model implements IModel {
@Override
public void getData(LoadDataCallback callback) {
//模擬耗時操作
new Thread(() -> {
try {
Thread.sleep(3000);
callback.success("3秒過去了,請求成功");
} catch (Exception e) {
e.printStackTrace();
callback.fail("失敗");
}
}).start();
}
public interface LoadDataCallback {
void success(String msg);
void fail(String msg);
}
}
複製程式碼
//Presenter層的介面,控制Model層的資料操作及呼叫View層的UI操作來完成“中間人”工作
public interface IPresenter {
void loadData(String msg);
}
複製程式碼
//用於model和view的相關方法的呼叫
public class Presenter implements IPresenter, Model.LoadDataCallback {
public IModel mModel;
public IView mView;
public Presenter(IView view) {
mView = view;
mModel = new Model();
}
@Override
public void loadData(String msg) {
System.out.println(msg);
mView.showProgress("這是載入框:資料正在載入中,請等待...");
mModel.getData(Presenter.this);
}
@Override
public void success(String msg) {
mView.showData(msg);
}
@Override
public void fail(String msg) {
System.out.println(msg);
}
}
複製程式碼
//View層介面---執行各種UI操作,定義的方法主要是給Presenter中來呼叫的
public interface IView {
void showProgress(String msg);
void showData(String data);
}
複製程式碼
//實現IView介面並實現各種UI操作的方法(其他的業務邏輯在Presenter中進行操作)
public class Main implements IView {
public static void main(String[] args) {
Main main = new Main();
main.doWork();
}
private void doWork() {
IPresenter mPresenter = new Presenter(Main.this);
mPresenter.loadData("開啟網路請求...");
}
@Override
public void showProgress(String msg) {
System.out.println(msg);
}
@Override
public void showData(String data) {
System.out.println(data);
}
}
複製程式碼
輸出結果
開啟網路請求...
這是載入框:資料正在載入中,請等待...
3秒過去了,請求成功
複製程式碼
總結
通過上面的程式碼可見,MVP模式就是將Main類中的業務和檢視邏輯進行抽取分別給Model和Presenter來進行操作,但顯而易見的是,增加了很多額外的類,一定程度上增加了開發量。
另外,若一個頁面有更多的操作,MVP的優勢將更加明顯,同時,這也方便後續的新成員更容易理解該頁面的邏輯。