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,);
}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相關内容。