mvp模式

葉少磐發表於2019-04-16

MVP模式

引言

由於在android中,MVC模式中的C承擔了C和V的作用,導致C中的程式碼十分混亂,難以閱讀。現在MVP模式目前在android應用程式中被廣泛使用,主要由於:

MVP優勢

  • MVP模式將檢視和業務邏輯相分離,減輕了C的負擔,降低了耦合。
  • 檢視和業務邏輯的程式碼被分別抽取到Model和Presenter中,曾經的C層變得簡潔,提高了程式碼的可閱讀性。
  • 業務程式碼被抽取到Presenter中,方便了單元測試。
  • 業務程式碼被抽取到Presenter中,避免了後臺執行緒引用Activity或fragment,造成記憶體洩漏。

MVP的UML圖

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的優勢將更加明顯,同時,這也方便後續的新成員更容易理解該頁面的邏輯。

相關文章