android 开发之初学MVP设计模式(模拟登录)
以模拟登录为例,学习MVP模式
一、新建工程,创建MVP目录结构
1、activity 主要放activity界面
2、Model M层 主要放基本实体类、接口和接口实现类
3、View V层 view与presenter交互的接口,让Activity实现
4、Presenter P层 Model与view的控制器,持有view和model的引用,从view中获取参数,交给model去处理,执行结果通过接口的方式通过presenter层传递给view层进行显示。
二、在veiw层中创建LoginView 接口,获取activity中需要的参数
在Activity中实现该接口,将参数暴露给loginview
三、在model层创建OnLoginListener接口 ,用来监听处理model实现后的操作;
在presenter层创建LoginPresenter类实现OnLoginListener接口,用来处理model的View
/**
* Created by zzj on 2017/1/6.
*/
public class LoginPresenter implements OnLoginListener {
@Override
public void onUsernameError() {
}
@Override
public void onPasswordError() {
}
@Override
public void onSuccess() {
}
@Override
public void onFailure() {
}
}
四、在model层创建登录接口(LoginPort),获取需要的参数
/**
* 登录接口
* Created by zzj on 2017/1/6.
*/
public interface LoginPort {
void login(String username,String password,OnLoginListener onLoginListener);
}
在model层中创建loginModelImple类实现LoginPort接口,此类主要是处理网络请求的操作。由于本次未使用到网络请求,简单实现本地模拟登录。
/** 处理网络请求的操作
* Created by zzj on 2017/1/6.
*/
public class LoginModelImple implements LoginPort {
@Override
public void login(String username, String password, OnLoginListener onLoginListener) {
if(username.equals("admin")&&password.equals("123456")){
onLoginListener.onSuccess();//登录成功
}else if(!username.equals("admian")||!password.equals("123456")){
onLoginListener.onUsernameError();//用户名或者密码错误
}else {
onLoginListener.onFailure();//登录失败
}
}
}
五、在LoginPresenter类中,声明实例化登录接口(LoginPort)和登录View(LoginView),将从view层获取的用户名和密码传送给model层,然后让activity中的登录按钮调用
/**
* Created by zzj on 2017/1/6.
*/
public class LoginPresenter implements OnLoginListener {
private LoginPort loginPort;//登录接口
private LoginView loginView;//登录veiw
//实例化登录接口和登录view
public LoginPresenter(LoginView loginView){
this.loginView = loginView;
loginPort = new LoginModelImple();
}
/**
* 将从view层中获取的用户名和密码传送给Model层
* 然后让activity中的登录按钮调用此方法
*/
public void login(){
String username = loginView.getUsername();
String password = loginView.getPassword();
loginPort.login(username,password,this);
}
@Override
public void onUsernameError() {
loginView.showToast("用户名或者密码错误");
}
@Override
public void onSuccess() {
loginView.showToast("登录成功!");
}
@Override
public void onFailure() {
loginView.showToast("异常错误!");
}
}
在loginAcitivy中实例化LoginPresenter类,调用login方法。
public class LoginActivity extends AppCompatActivity implements View.OnClickListener,LoginView {
private AppCompatEditText username ,password;
private AppCompatButton loginBt;
private LoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
loginPresenter = new LoginPresenter(this);
}
private void initView(){
username = (AppCompatEditText) findViewById(R.id.login_username);
password = (AppCompatEditText) findViewById(R.id.login_password);
loginBt = (AppCompatButton) findViewById(R.id.login_loginbt);
loginBt.setOnClickListener(this);
}
/**
* 向view层暴露参数
* @return 用户名
*/
public String getUsername(){
return username.getText().toString().trim();
}
public String getPassword(){
return password.getText().toString().trim();
}
@Override
public void showToast(String msg) {
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
loginPresenter.login();
}
}
效果展示: