android MVP设计模式!
实现原理:
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 + "]";
}
}
最新文章
- iOS实现用控制器作为弹框效果(modalPresentationStyle)
- 分布式架构高可用架构篇_08_MyCat在MySQL主从复制基础上实现读写分离
- *[hackerrank]Lexicographic paths
- [MEAN Stack] First API -- 4. Organize app structure
- C++单链表的创建与操作
- Golang基于学习总结
- logging模块
- Java企业微信开发_07_素材管理之上传本地临时素材文件
- socket的简单例子
- ES6之Set方法与Map方法
- 【译】Gradle 的依赖关系处理不当,可能导致你编译异常
- Python快速学习10: 循环的对象及设计 (生活的规律)
- vuex 的基本使用之Module
- Vue项目
- [转]Aroon Indicator
- python36--将数据保存为excel
- phoenix客户端连接hbase数据库报错:Traceback (most recent call last): File ";bin/sqlline.py";, line 27, in <;module>; import argparse ImportError: No module named argparse
- Android井字游戏(二)游戏界面
- static作用(修饰函数、局部变量、全局变量)
- delphi TComponent类 2