文章目录
1. MVP模式简介
1.1 MVP所对应的意义
MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。
M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控View与Model之间的间接交互。
2. MVP模式的应用
2.1 model层描述和具体代码
提供想要展示在view层的数据和具体业务逻辑处理的实现
package com.fw.mvp.mvp.model;
import com.fw.mvp.callback.MCallback;
/**
* description :Model层接口
* author : apple
* date : 2021/6/16 15:19
*/
public interface IMVPModel {
/**
* 成功:返回数据
* 失败:回调失败
*
* @param name
* @param mCallback
*/
void getAcountData(String name, MCallback mCallback);
}
package com.fw.mvp.mvp.model;
import com.fw.mvp.bean.Acount;
import com.fw.mvp.callback.MCallback;
import java.util.Random;
/**
* description :Model层实现
* author : apple
* date : 2021/6/16 11:06
*/
public class MVPModel implements IMVPModel {
/**
* 成功:返回数据
* 失败:回调失败
*
* @param name
* @param mCallback
*/
@Override
public void getAcountData(String name, MCallback mCallback) {
Random random = new Random();
boolean isSuccess = random.nextBoolean();
if (isSuccess) {
Acount acount = new Acount();
acount.setName(name);
acount.setLevel(111);
mCallback.onSuccess(acount);
} else {
mCallback.onFail();
}
}
}
2.2 view层描述和具体代码
负责显示数据、提供友好界面跟用户交互
package com.fw.mvp.mvp.view;
import com.fw.mvp.bean.Acount;
/**
* description :View层接口,其具体实现类为MVPActivity
* author : apple
* date : 2021/6/16 11:03
*/
public interface IMVPView {
/**
* 获取输入内容
*
* @return
*/
String getInputText();
/**
* 展示成功结果
*
* @param acount
*/
void showSuccessPage(Acount acount);
/**
* 展示失败结果
*/
void showFail();
}
package com.fw.mvp.mvp;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.fw.mvp.R;
import com.fw.mvp.bean.Acount;
import com.fw.mvp.mvp.presenter.IMVPPresenter;
import com.fw.mvp.mvp.presenter.MVPPresenter;
import com.fw.mvp.mvp.view.IMVPView;
/**
* description :View层实现类
* author : apple
* date : 2021/6/15 21:04
*/
public class MVPActivity extends AppCompatActivity implements IMVPView, View.OnClickListener {
private EditText editText;
private Button button;
private TextView textView;
private IMVPPresenter mvpPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp);
initView();
initData();
}
private void initView() {
editText = findViewById(R.id.et);
button = findViewById(R.id.btn);
textView = findViewById(R.id.tv);
}
private void initData() {
button.setOnClickListener(this);
mvpPresenter = new MVPPresenter(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn) {
mvpPresenter.onClick(getInputText());
}
}
@Override
public String getInputText() {
return editText.getText().toString().trim();
}
@SuppressLint("SetTextI18n")
@Override
public void showSuccessPage(Acount acount) {
textView.setText(acount.getName() + " | " + acount.getLevel());
}
@Override
public void showFail() {
textView.setText("数据获取失败");
}
}
2.3 presenter层描述和具体代码
Presenter扮演着view和model的中间层的角色。
获取model层的数据之后构建view层;
也可以收到view层UI上的反馈命令后分发处理逻辑,交给model层做业务操作。
package com.fw.mvp.mvp.presenter;
/**
* description :Presenter层接口
* author : apple
* date : 2021/6/16 15:24
*/
public interface IMVPPresenter {
/**
* 点击事件
*
* @param name
*/
void onClick(String name);
}
package com.fw.mvp.mvp.presenter;
import com.fw.mvp.bean.Acount;
import com.fw.mvp.callback.MCallback;
import com.fw.mvp.mvp.model.IMVPModel;
import com.fw.mvp.mvp.model.MVPModel;
import com.fw.mvp.mvp.view.IMVPView;
/**
* description :Presenter层实现
* author : apple
* date : 2021/6/16 11:11
*/
public class MVPPresenter implements IMVPPresenter {
private IMVPView mView;
private IMVPModel mModel;
public MVPPresenter(IMVPView mView) {
this.mView = mView;
mModel = new MVPModel();
}
@Override
public void onClick(String name) {
//调用model去进行逻辑处理
mModel.getAcountData(name, new MCallback() {
@Override
public void onSuccess(Acount acount) {
//通知view层进行UI构建刷新
mView.showSuccessPage(acount);
}
@Override
public void onFail() {
//通知view层进行UI构建刷新
mView.showFail();
}
});
}
}
2.4 使用到的自定义的接口
package com.fw.mvp.callback;
import com.fw.mvp.bean.Acount;
/**
* description :回调接口
* author : apple
* date : 2021/6/16 11:30
*/
public interface MCallback {
void onSuccess(Acount acount);
void onFail();
}
3. demo代码流程
3.1 代码流程
demo的代码流程:(请参考下面的类图)
1、 MVPActivity做了一些UI初始化的东西,需要实例化对应IMVPPresenter的引用,和实现 IMVPView的接口,监听界面动作;
2、 button按钮按下后出发点击事件,在onClick里接收到即通过MVPPresenter的引用把它交给MVPPresenter处理;
3、 然后MVPPresenter把逻辑交给Model层去处理,也就是这里面的MVPModel;
4、 MVPModel处理完逻辑之后,结果通过回调通知MVPPresenter;
5、MVPPresenter再把结果返回给View层的MVPActivity,最后MVPActivity显示结果。