天天看點

mvp模式初探mvp模式初探

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模式初探mvp模式初探

使用mvp模式流程

  • 首先建立一個Presenter接口,并建立的它的實作類PresenterImpl,用以實作所有的邏輯;
  • 建立一個IView接口用于實作view(視圖)邏輯,它的實作類是activity或fragment;
  • 在Activity中包含一個Presenter的引用,PresenterImpl中又包含一個IView的引用和model的依賴;

    這樣Activity的業務就可以交給Presenter來實作了。

mvp的簡單例子

為友善說明mvp在實際開發中的應用,這裡舉個簡單的例子,友善了解。

代碼結構

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,);
        }else{
            iLoginView.onLoginResult(false,);
        }
    }
}
           

最後是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相關内容。

繼續閱讀