一、MVP介绍
MVP(Model-View-Presenter)是MVC的演化版本。
- Model:主要提供数据的存取功能。Presenter需要通过Model层来存储、获取数据。
- View:负责处理用户事件和视图部分的展示。在Android中,它可能是Activity、Fragment类或者是某个View控件。
- Presenter:作为View和Model之间沟通的桥梁,它从Model层检索数据后返回给View层,使得View和Model之间没有耦合。
二、简例
简例参考鸿洋博客
下面举个简单的例子来实现登录。
工程结构如下:
Model层
用户包含账号密码
package com.android.myapplication.model;
public class User {
private String name;
private String password;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
定义一个登录接口
package com.android.myapplication.model;
public interface IUserLogin {
void login(String name, String password, AddUserLoginListener loginListener);
}
实现该接口,判断登录情况
package com.android.myapplication.model;
public class UserLogin implements IUserLogin {
@Override
public void login(String name, String password, AddUserLoginListener loginListener) {
User user = new User();
user.setName(name);
user.setPassword(password);
if (name.equals("zhangsan") && password.equals("123")) {
loginListener.loginSuccess(user);
} else {
loginListener.loginFailed(user);
}
}
}
定义一个监听事件,监听登录成功和失败事件
package com.android.myapplication.model;
public interface AddUserLoginListener {
void loginSuccess(User user);
void loginFailed(User user);
}
View层
定义一个接口,为Presenter访问
package com.android.myapplication.view;
import com.android.myapplication.model.User;
public interface IUserLoginView {
String getName();
String getPassword();
void onSuccess(User user);
void onFailed(User user);
}
View的实现类,也就是Activity
package com.android.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.myapplication.model.User;
import com.android.myapplication.presenter.UserLoginPresenter;
import com.android.myapplication.view.IUserLoginView;
public class MVPActivity extends AppCompatActivity implements IUserLoginView {
private EditText mEtName;
private EditText mEtPassword;
private Button mButtonLogin;
private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mEtName = findViewById(R.id.et_name);
mEtPassword = findViewById(R.id.et_password);
mButtonLogin = findViewById(R.id.bt_login);
mButtonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUserLoginPresenter.login();
}
});
}
@Override
public String getName() {
return mEtName.getText().toString();
}
@Override
public String getPassword() {
return mEtPassword.getText().toString();
}
@Override
public void onSuccess(User user) {
Toast.makeText(this, "用户:" + user.getName() +
"登录成功", Toast.LENGTH_LONG).show();
}
@Override
public void onFailed(User user) {
Toast.makeText(this, "用户:" + user.getName() +
"账号或密码错误", Toast.LENGTH_LONG).show();
}
}
Presenter层
连接Model和View
package com.android.myapplication.presenter;
import android.util.Log;
import com.android.myapplication.model.AddUserLoginListener;
import com.android.myapplication.model.IUserLogin;
import com.android.myapplication.model.User;
import com.android.myapplication.model.UserLogin;
import com.android.myapplication.view.IUserLoginView;
public class UserLoginPresenter {
private IUserLoginView userLoginView;
private IUserLogin userLogin;
public UserLoginPresenter(IUserLoginView userLoginView) {
this.userLoginView = userLoginView;
userLogin = new UserLogin();
}
public void login(){
userLogin.login(userLoginView.getName(), userLoginView.getPassword(), new AddUserLoginListener() {
@Override
public void loginSuccess(User user) {
userLoginView.onSuccess(user);
}
@Override
public void loginFailed(User user) {
userLoginView.onFailed(user);
}
});
}
}