Android开发MVP模式个人见解

来源:互联网 发布:钢笔字帖谁的好 知乎 编辑:程序博客网 时间:2024/06/05 03:17

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;}@Overridepublic 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;

@Overrideprotected 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();        }    });}@Overridepublic String getUserName() {    return mUsername.getText().toString();}@Overridepublic String getPassword() {    return mPassword.getText().toString();}@Overridepublic void setUserName(String userName) {    mUsername.setText(userName);}@Overridepublic void setPassword(String password) {    mPassword.setText(password);}@Overridepublic void toMainActivity(User user) {    Toast.makeText(this, user.getUsername() +            " 登陆成功", Toast.LENGTH_SHORT).show();}@Overridepublic void showFailedError() {    Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();}@Overrideprotected void onStart() {    super.onStart();    mUserLoginPresenter.setDAta();}@Overrideprotected 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结合在一起,可以让他们之间的方法互相调用。

2 0
原创粉丝点击