Mvp模式解析

前言:

MVP模式是從MVVM 模式轉化而來,MVVM是Model-View-ViewModel的簡寫,而MVP則是Model-View-Presenter 模式,其中Model負責網絡數據請求及數據格式轉換,view負責頁面數據的刷新,presenter則為中轉站負責兩者之間的協調。

下面列舉兩種的差別:

1、MVC

MVC 模式是model view 和 controller 三者之間可以互相通信,但是這樣就存在一個問題,就是view層可以調用model層和controller層的代碼,所以會導致邏輯混亂。

2、MVP
MVP 是Model view 和 Presenter 組成,MVP最大的好處就是剝離了Presenter層出來替換掉了Controller,從而使得model 層和view層不能直接進行通信,必須通過presenter層間接進行通信,一般來說一個Activity只有一個presenter層來控制邏輯,但是在復雜的Activity中可以通過綁定多個Presenter來實現復雜的邏輯。

下面為大家展示下我已經封裝好的邏輯代碼:

model :
<pre>
//basemodel 與數據請求相關的接口

public class BaseModel {

public  interface Classify {      
    void getCookClassify(CallBack<CookClassify> callBack);      
}      

}
//MainModel 實現BaseModel.Classify中的接口進行數據請求
public class MainModel implements BaseModel.Classify {
@Override
public void getCookClassify(CallBack<CookClassify> callBack) {
// 數據請求
GetDataList.getCookClassify(callBack);
}
}
</pre>

view:

<pre>
//baseActivity 源碼:

public abstract class BaseActivity<T> extends AppCompatActivity {
//Presenter 實例
protected T presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    beforeOnCreate();
    super.onCreate(savedInstanceState);
    setContentView(getLayoutId());
    initViews();
    initdata();
}

protected abstract int getLayoutId();

protected abstract void initViews();

protected abstract void initdata();

protected  void beforeOnCreate(){

}


@Override
protected void onResume() {
    super.onResume();
    afterOnResume();
}

protected  void afterOnResume(){

}

@Override
protected void onDestroy() {
    super.onDestroy();
    afterOnDestory();
}

protected  void afterOnDestory(){

}

}

//baseview 接口,用來刷新頁面數據,可以根據需求添加不同的方法。
public interface BaseView<T> {
//顯示加載框
void showDialog();
//加載成功
void onSuccess(T t);
//加載失敗
void onError(Throwable t);
//取消加載框
void dismissDialog();
}
</pre>

presenter:

<pre>
public class MainPresenter {
// 頁面刷新接口
private BaseView baseView;
// 數據調用model
private BaseModel.Classify cookClassify;

public MainPresenter init(BaseView baseView) {
    this.baseView = baseView;
    this.cookClassify = new MainModel();
    return this;
}

public void getData() {
    baseView.showDialog();
    cookClassify.getCookClassify(new CallBack<CookClassify>() {
        @Override
        public void onCompleted() {
            baseView.dismissDialog();
        }

        @Override
        public void onError(Throwable e) {
            baseView.dismissDialog();
            baseView.onError(e);
        }

        @Override
        public void onNext(CookClassify cookClassify) {
            baseView.onSuccess(cookClassify);
        }
    });
}

}
</pre>

使用步驟:

在BaseModel 中新建model接口 例:
<code>
public interface Classify {
void getCookClassify(CallBack<CookClassify> callBack);
}
</pre>

新建相應的Model實現接口里的方法并進行數據獲取 例:
<pre>
public class MainModel implements BaseModel.Classify {
@Override
public void getCookClassify(CallBack<CookClassify> callBack) {
GetDataList.getCookClassify(callBack);
}
}
</pre>

新建presenter 例:
<pre>
public class MainPresenter {
private BaseView baseView;
private BaseModel.Classify cookClassify;

public MainPresenter init(BaseView baseView) {
this.baseView = baseView;
this.cookClassify = new MainModel();
return this;
}

public void getData() {
baseView.showDialog();
cookClassify.getCookClassify(new CallBack<CookClassify>() {
@Override
public void onCompleted() {
baseView.dismissDialog();
}
@Override
public void onError(Throwable e) {
baseView.dismissDialog();
baseView.onError(e);
}
@Override
public void onNext(CookClassify cookClassify) {
baseView.onSuccess(cookClassify);
}
});
}
}
</pre>
繼承BaseActivity并傳入presenter數據類型 例:
<pre>
public class MainActivity extends BaseActivity<.MainPresenter> implements BaseView<CookClassify> {

@Override
protected void initdata() {
// 實例化presenter
presenter = new MainPresenter().init(this);
presenter.getData();
}

@Override
public void showDialog() {
//todo: 顯示dialog
}
@Override
public void onSuccess(CookClassify cookClassify) {
//todo: 刷新頁面數據
MyListAdapter adapter = getAdapter();
adapter.refreshDatas(cookClassify.getTngou());
}
@Override
public void onError(Throwable t) {
//todo: 錯誤處理
Log.d("debug", "onError===>" + t.getLocalizedMessage());
}
@Override
public void dismissDialog() {
//todo: 取消dialog顯示
}
}

</pre>

更多詳情見github openobj:

github : https://github.com/momentslz

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容