android MVP设计模式!

时间:2024-08-03 16:36:02

实现原理:

MainActivity 用来更新UI,和显示业务逻辑的结果!

LoginPresenterCompl 用来处理 业务逻辑

ILoginPresenter 业务处理类抽象出来的接口

ILoginView activity抽象出来的接口

1.为什么要把activity的UI更新方法抽象出来?

因为你的项目不可能只有一个activity吧,如果想要每个activity都用MVP模式,那么就把共有的方法抽象出来就可以的

2.为什么要把业务处理类抽象出来?

同理,每个activity的业务处理逻辑肯定是不一样的,我们可以使用java的特性,即重写,虽然每个业务类的方法名,参数,返回类型相同,但是我们可以在里面处理不同的逻辑

比如A在里面处理吃西瓜,B在里面处理吃梨子,返回的都是水果类型!

3.为什么要用MVP模式?

当你的代码量很多的时候,如果不采用较好的框架,后续维护和查找就会显得很乱,自己都不知道从来找,出现问题第一时间也没办法分析出来,总之一个好的APK,最好是在前期采用好的框架搭建!

首先是activity的代码:

ublic class MainActivity extends Activity implements ILoginView{

private Button button1;
private Button button2;
private EditText edit1;
private EditText edit2;
private ILoginPresenter presenterCompl;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenterCompl = new LoginPresenterCompl(this);
button1 = (Button)findViewById(R.id.button1);
button2 = (Button)findViewById(R.id.button2);
edit1 = (EditText)findViewById(R.id.edit1);
edit2 = (EditText)findViewById(R.id.edit2);

button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
presenterCompl.doLogin(edit1.getText().toString(), edit2.getText().toString());
}
});
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
presenterCompl.clear();
}
});

}
@Override
public void onClearText() {
edit1.setText("");
edit2.setText("");
Toast.makeText(getApplicationContext(), "clear", 1).show();
}

@Override
public void onLoginResult(Boolean result, int code) {
if(result){
Toast.makeText(getApplicationContext(), "登录成功", 1).show();
}else{
Toast.makeText(getApplicationContext(), "登录失败", 1).show();
}
}

}

他实现了ILoginView接口,这个接口定义的两个方法,一个用来清除edittext的数据,一个用来显示逻辑任务类的处理结果,结果的方法可以根据自己公司具体业务需求来定!

public interface ILoginView {
public void onClearText();
public void onLoginResult(Boolean result, int code);
}

接下来是逻辑任务类LoginPresenterCompl

public class LoginPresenterCompl implements ILoginPresenter{
private ILoginView mView;
private User user;
@Override
public void clear() {
mView.onClearText();
}

@Override
public void doLogin(String name, String password) {
boolean result = false;
int code = 0;
if(name.equals(user.getName())&&password.equals(user.getPassword())){
result = true;
code = 1;
}else{
result = false;
code = 0;
}
mView.onLoginResult(result, code);
}
public LoginPresenterCompl(ILoginView view) {
this.mView = view;
user = new User("000","123456");
}
}

这个类实现了ILoginPresenter接口,因为你以后项目的逻辑任务肯定不止一种情况,所以我们抽象出来共同的方法

只要实现这个接口就行,具体的任务逻辑看自己公司需要,比如我们公司采用的登录验证,在activity中获得用户输入

的账号和密码,然后跟实体类的数据进行对比(注意这里的实体类是为了方便才这样写的,实际情况应该是从数据库中

或者从网络请求中获取数据然后保存到实体类,这里就不具体说了),最后调用activity里面抽象出来的更新UI的方法,

实际上就是把结果返回给activity的,因为activity实现了这个这个接口!

public interface ILoginPresenter {
public void clear();
public void doLogin(String name, String password);
}

实体类:

public class User {
private String name;
private String password;
public User(String name,String pwd) {
this.name = name;
this.password = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + "]";
}

}