Android开发MVP模式个人见解

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值