Android开发MVP模式个人见解
1. MVC:
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:[
- Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
- View(视图)显示数据(数据库记录)。
- Controller(控制器)处理输入(写入数据库记录)。
MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
2. MVP。
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
- Model业务逻辑和数据实体的模型,可以浅显的理解为数据实体类和特定事件的逻辑方法封装类
- View在Android中,简单理解可以认为是actviity和布局文件,加上对视图相应的view组件上事件数据操作的interface接口类总和(浅显理解)
- Presenter 负责完成View于Model间的交互。
在Android中一个mvp下的用户登录domemodel:
用户实体类
public class User { private String username ; private String password ;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
定义一个接口类方便登录成功或者失败动作监听
public interface OnLoginListener {
void loginSuccess(User user);//登陆成功
void loginFailed();//登录失败
}
登录的接口类
public interface UserLogin {
public void login(String username, String password, OnLoginListener mListener);
}
登录的实现类
public class UserHttpLogin implements UserLogin {
@Override
public void login(String username, String password, OnLoginListener mListener) {
if (“soufang”.equals(username) && “123456”.equals(password))
{
User user = new User();
user.setUsername(username);
user.setPassword(password);
mListener.loginSuccess(user);
} else
{
mListener.loginFailed();
}
}
View:
public interface MyLoginView {
String getUserName();
String getPassword();
void setUserName(String userName);
void setPassword(String password);
void toMainActivity(User user);//登陆成功
}
MyLoginView 作用在于让activity实现它,让activity是一个MyLoginView ,这样关于对用户名 密码的获取或者设置的操作就可以单独提取出来,对登录成功失败时的监听也可以用方法抽象出来便于presenter模块调用。
public class MainActivity extends Activity implements MyLoginView {
private EditText mUsername, mPassword;
private Button mBtnLogin;
private UserLoginPresenter mUserLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
mUsername = (EditText) findViewById(R.id.et_username);
mPassword = (EditText) findViewById(R.id.et_password);
mBtnLogin = (Button) findViewById(R.id.bt_login);
mUserLoginPresenter = new UserLoginPresenter(this);
mBtnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUserLoginPresenter.login();
}
});
}
@Override
public String getUserName() {
return mUsername.getText().toString();
}
@Override
public String getPassword() {
return mPassword.getText().toString();
}
@Override
public void setUserName(String userName) {
mUsername.setText(userName);
}
@Override
public void setPassword(String password) {
mPassword.setText(password);
}
@Override
public void toMainActivity(User user) {
Toast.makeText(this, user.getUsername() +
" 登陆成功", Toast.LENGTH_SHORT).show();
}
@Override
public void showFailedError() {
Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
}
@Override
protected void onStart() {
super.onStart();
mUserLoginPresenter.setDAta();
}
@Override
protected void onDestroy() {
super.onDestroy();
//个人认为在actity销毁时,把引用上下文的对象或者需要销毁的手动销毁
mUserLoginPresenter = null ;
}
}
view就是界面的呈现,及封装相应方法,便于 View和model交互时在presenter中调用:
presenter:
public class UserLoginPresenter {
private UserHttpLogin userBiz;
private MyLoginView userLoginView;
public UserLoginPresenter(MyLoginView userLoginView) {
this.userLoginView = userLoginView;
this.userBiz = new UserHttpLogin();
}
public void login() {
userBiz.login(userLoginView.getUserName(),userLoginView.getPassword(),new OnLoginListener(){
@Override
public void loginSuccess(User user) {
userLoginView.toMainActivity(user);
}
@Override
public void loginFailed() {
userLoginView.showFailedError();
}
});
}
public void setDAta() {
userLoginView.setPassword("MVP");
userLoginView.setUserName("安安");
}
}
presenter 把activity变成他的一个View的MyLoginView对象,并声明model的登录实现类UserHttpLogin的对象,这样就有效的把View与model结合在一起,可以让他们之间的方法互相调用。