转载请标明出处:
http://blog.youkuaiyun.com/changs_roid/article/details/50826557
概述:
当我们熟悉mvc模式后,就不难理解mvp了,mvp只是在mvc的基础上加了一个presenter层来解耦mode层和view层。下面请看一个简单的例子:
一、mvc
mvc设计图例子:
可以看到mode、view、control层三者互相之间都有联系!
代码:
代码块
LoginOpr.java
public interface LoginOpr {
void login(String name,String pwd);
}
ILoginView.java
public interface ILoginView {
void logining();
void loginSuccess();
void loginFail(String error);
}
LoginOprImpl.java
public class LoginOprImpl implements LoginOpr {
private ILoginView loginView;
public LoginOprImpl(ILoginView loginView) {
this.loginView = loginView;
}
@Override
public void login(String name, String pwd) {
loginView.logining();
HttpUtils.login(name, pwd, new HttpUtils.HttpListener() {
@Override
public void success() {
loginView.loginSuccess();
}
@Override
public void fail(String err) {
loginView.loginFail("密码或用户名不对");
}
});
}
}
LoginActivity.java
public class LoginActivity extends AppCompatActivity implements ILoginView {
LoginOpr loginOpr;
TextView textView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loginOpr = new LoginOprImpl(this);
textView = (TextView) findViewById(R.id.login);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginOpr.login("kelly","123");
}
});
}
@Override
public void logining() {
textView.setText("正在登录中");
textView.setClickable(false);
}
@Override
public void loginSuccess() {
textView.setText("登录成功,界面跳转中...");
}
@Override
public void loginFail(String error) {
textView.setText(error);
textView.setClickable(true);
}
}
二、mvp
mvp设计图例子:
通过LoginPresenter来控制loginOpr和loginView。
在mode层就没有对view的引用了,各干各的。
代码:
代码块
LoginOpr.java
public interface LoginOpr {
void login(String name, String pwd , OnHandListener<String> listener);
}
LoginPresenter.java
public interface LoginPresenter {
void login(String name,String pwd);
}
LoginView .java
public interface LoginView {
void logining();
void loginSuccess();
void loginFail(String error);
}
LoginOprImpl.java
public class LoginOprImpl implements LoginOpr {
@Override
public void login(String name, String pwd, final OnHandListener<String> listener) {
HttpUtils.login(name, pwd, new HttpUtils.HttpListener() {
@Override
public void success() {
listener.success(null);
}
@Override
public void fail(String err) {
listener.fail(null,"用户名或密码错误");
}
});
}
}
LoginPresenterImpl.java
public class LoginPresenterImpl implements LoginPresenter {
LoginOpr loginOpr;
LoginView loginView;
public LoginPresenterImpl(LoginView loginView) {
this.loginView = loginView;
this.loginOpr = new LoginOprImpl();
}
@Override
public void login(String name, String pwd) {
loginView.logining();
loginOpr.login(name, pwd, new OnHandListener<String>() {
@Override
public void success(String s) {
loginView.loginSuccess();
}
@Override
public void fail(String s, String error) {
loginView.loginFail(error);
}
});
}
}
LoginActivity.java
public class LoginActivity extends AppCompatActivity implements LoginView {
LoginPresenter loginPresenter;
TextView textView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loginPresenter = new LoginPresenterImpl(this);
textView = (TextView) findViewById(R.id.login);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginPresenter.login("kelly","123");
}
});
}
@Override
public void logining() {
textView.setText("正在登录中");
textView.setClickable(false);
}
@Override
public void loginSuccess() {
textView.setText("登录成功,界面跳转中...");
}
@Override
public void loginFail(String error) {
textView.setText("登录失败,请重试");
}
}
完整demo下载地址:
http://download.youkuaiyun.com/detail/changs_roid/9455550