MVP即:Model层(模型层)、View层(视图层)、Presenter(中间层)
MVP模型图
优点:
解决了MVC中Contreller与View过度耦合的缺点,职责划分明显,更加易于维护
缺点:
接口数量多,项目复杂度升高。随着项目复杂度的提升,Presenter层将越来越臃肿
MVP实现需求
1.MVPActivity负责提供View层面的功能(采用接口实现的方式)
2.MVPModel负责提供数据方面的功能
3.Model与View不再直接通信,通过presenter来实现
使用MVP的建议
1.接口规范化(封装父类接口以减少接口的使用量)
2.使用第三方插件自动生成MVP代码
3.对于一些简单的界面,可以选择不使用框架
4.根据项目复杂程度,部分模块可以选择不使用接口
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".framework_mode.normal.NormalActivity">
<EditText
android:id="@+id/ed_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:hint="请输入要查询的账号"/>
<Button
android:id="@+id/btn_get_account"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="80dp"
android:text="获取账号信息"/>
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="80dp"
android:hint="账号信息暂未获取"/>
</LinearLayout>
实体类
/**
* 账号信息
* @author Administrator
*/
public class Account {
/** 账号名称 */
private String name;
/** 账号等级 */
private int level;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
接口代码
public interface IMVPView {
/**
* 获取用户输入信息
* @return
*/
String getUserInput();
/**
* 展示获取数据成功的界面
* @param account
*/
void showSuccessPage(Account account);
/**
* 展示获取数据失败的界面
*/
void showFailedPage();
}
Model
/**
* Model层
* 数据处理(网络请求、SQL等)
* @author Administrator
*/
public class MVPModel {
/**
* 模拟获取账号数据
* @param accountName
* @param callback
*/
public void getAccountData(String accountName, MCallback callback) {
Random random = new Random();
boolean isSuccess = random.nextBoolean();
if (isSuccess) {
Account account = new Account();
account.setName(accountName);
account.setLevel(100);
callback.onSuccess(account);
} else {
callback.onFailed();
}
}
}
Presenter
public class MVPPresenter {
private IMVPView mView;
private MVPModel mModel;
public MVPPresenter(IMVPView mView) {
this.mView = mView;
mModel = new MVPModel();
}
public void getData(String accountName){
mModel.getAccountData(accountName, new MCallback() {
@Override
public void onSuccess(Account account) {
mView.showSuccessPage(account);
}
@Override
public void onFailed() {
mView.showFailedPage();
}
});
}
}
View
public class MVPActivity extends AppCompatActivity implements View.OnClickListener, IMVPView {
/** 展示查询结果 */
private TextView mTvResult;
/** 用户输入的信息 */
private EditText mEtAccount;
private MVPPresenter mvpPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_normal);
initView();
mvpPresenter = new MVPPresenter(this);
}
/**
* 初始化View
*/
private void initView() {
mTvResult = findViewById(R.id.tv_result);
mEtAccount = findViewById(R.id.ed_account);
findViewById(R.id.btn_get_account).setOnClickListener(this);
}
@Override
public void onClick(View v) {
mvpPresenter.getData(getUserInput());
}
@Override
public String getUserInput() {
return mEtAccount.getText().toString();
}
@Override
public void showSuccessPage(Account account) {
mTvResult.setText("用户账号:" + account.getName() + "|" + "用户等级:" + account.getLevel() );
}
@Override
public void showFailedPage() {
mTvResult.setText("获取数据失败");
}
}