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下的用户登录dome

model:

用户实体类

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结合在一起,可以让他们之间的方法互相调用。