mvp模式初探

来源:互联网 发布:莫宁职业生涯数据 编辑:程序博客网 时间:2024/06/06 07:51

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模式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相关内容。

0 0
原创粉丝点击