mvp模式初探
前言
mvp应用逐渐广泛,学习mvp模式,将给你的编码带来很大的优势。
什么是mvp
mvp,全称model view presenter,是mvc的升级版。我们都知道mvc表现层与业务层分离,耦合度不高。实际上,我们也知道,mvc(model view controler)中,view 和controler基本上是由activity承载,这就造成一个activity可能很庞大,不便于后期维护和升级。
mvp即是通过presenter接口将view与model解耦,各模块可独立变化, 有效降低耦合度。
mvp思想
mvp将activity中的UI逻辑抽象成view接口,把业务逻辑抽象成presenter接口,model还是原来的model。
mvp模式中,acitvity用来显示view和管理acitivity生命周期,逻辑交由presenter实现。
mvp模式UML图
使用mvp模式流程
- 首先创建一个Presenter接口,并创建的它的实现类PresenterImpl,用以实现所有的逻辑;
- 创建一个IView接口用于实现view(视图)逻辑,它的实现类是activity或fragment;
- 在Activity中包含一个Presenter的引用,PresenterImpl中又包含一个IView的引用和model的依赖;
这样Activity的业务就可以交给Presenter来实现了。
mvp的简单例子
为方便说明mvp在实际开发中的应用,这里举个简单的例子,方便理解。
代码结构
首先看LoginActivity代码:
public class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener {
private Button btn_login;
private Button btn_clear;
private EditText et_name;
private EditText et_pwd;
private ILoginPresenter iLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_clear= (Button) findViewById(R.id.btn_clear);
btn_login= (Button) findViewById(R.id.btn_login);
et_name= (EditText) findViewById(R.id.et_name);
et_pwd= (EditText) findViewById(R.id.et_password);
btn_clear.setOnClickListener(this);
btn_login.setOnClickListener(this);
iLoginPresenter=new LoginPresenterCompl(this);
}
@Override
public void onClearText() {
et_pwd.setText("");
et_name.setText("");
}
@Override
public void onLoginResult(Boolean Result, int code) {
if(Result){
Toast.makeText(this,"登录成功!",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"登录失败,请检查用户名和密码。",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_clear:
iLoginPresenter.clear();
break;
case R.id.btn_login:
String name=et_name.getText().toString().trim();
String pwd=et_pwd.getText().toString().trim();
if(name.equals("")||pwd.equals("")){
Toast.makeText(this,"用户名和密码不能为空!",Toast.LENGTH_SHORT).show();
}
iLoginPresenter.doLogin(name,pwd);
break;
}
}
}
接着看Presenter,代码如下:
public interface ILoginPresenter {
public void doLogin(String name,String pwd);
public void clear();
}
跟着是ILoginView,代码如下:
public interface ILoginView {
public void onClearText();
public void onLoginResult(Boolean Result,int code);
}
Presenter的具体实现类,代码如下:
public class LoginPresenterImpl implements ILoginPresenter {
private ILoginView iLoginView;
private User user;
public LoginPresenterImpl(ILoginView iLoginView){
this.iLoginView=iLoginView;
user=new User("zhangshan","123456");
}
@Override
public void clear() {
iLoginView.onClearText();
}
@Override
public void doLogin(String name, String pwd) {
if (name.equals(user.getName())&&pwd.equals(user.getPwd())){
iLoginView.onLoginResult(true,200);
}else{
iLoginView.onLoginResult(false,202);
}
}
}
最后是model:
public class User {
private String name;
private String pwd;
public User(String name,String pwd){
this.name=name;
this.pwd=pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
这是一个很简单的demo。
最后再总结一下mvp带来的优势:
解耦,为activity瘦身,方便扩展维护。
这只是个起点,后续会进一步学习总结mvp相关内容。