MVC,MVP,MVVM的區別

1、MVC模式

(1)、mvc解決了什麼問題
MVC模式解耦合了M層和V層,M層和V層通過C層來交互

  • 模型層 (Model):業務邏輯對應的數據模型,無View無關,而與業務相關;
  • 視圖層 (View):一般使用XML或者Java對界面進行描述;
  • 控制層 (Controllor):在Android中通常指Activity和Fragment,或者由其控制的業務類;

(2)、代碼實現

public interface ICallback{
  void receive(boolean success);
}
public class LoginModel{
  public void login(String name,String password,ICallback callback){
    WebApi.login(name,password,callback);
  }
}
public class LoginActivity extends Activity{
  private LoginModel mLoginModel;// controller持有model實例
  private EditText mUserNameEt;
  private EditText mPasswordEt;
  private Button mSubmitBtn;
  public void onCreate(......){
    mLoginModel = new LoginModel(...);
    mSubmitBtn.setOnClickListener(new OnClickListener(View view){
        mLoginModel.login(mUserNameEt.get...,mPasswordEt.get...,new ICallback(){
          public void receive(boolean success){
            if(success){
              startActivity(new Intent(this,MainActivity.class));
              finish();
            } else {
              Toast.makeText(this,"登錄失敗",Toast.LENGTH_SHORT).show();
            }
          }
        });
    });
  }
}

2、MVP模式

(1)、MVP (Model-View-Presenter) 是MVC的演化版本,幾個主要部分如下:

  • 模型層 (Model):主要提供數據存取功能。
  • 視圖層 (View):處理用戶事件和視圖。在Android中,可能是指Activity、Fragment或者View。
  • 展示層 (Presenter):負責通過Model存取數據,連接View和Model,從Model中取出數據交給View。

(2)、代碼實現

public interface ILoginContract {

  public interface ILoginModel{
    public void login(String name,String password,ICallback callback);
  }

  public interface ILoginPresenter{
    public void login(String name,String password);
  }

  public interface ILoginView{
    public void showDialog();
    public void dismissDialog();
    public void showToast(String message);
    public void navigateToMain();
  }
}
public class PresenterImpl implements ILoginPresenter,ICallback{
  private ILoginView mLoginView;
  private ILoginModel mLoginModel;

  public PresenterImpl(ILoginView loginView){
    this.mLoginView = loginView;
    this.mLoginModel = new LoginModelImpl();
  }

  public void login(String name,String password){
    if(isEmpty(name)||isEmpty(password)){
        this.mLoginView.showToast("用戶名或密碼不能爲空");
        return;
    }
    this.mLoginModel.login(name,password,this);
  }

  public void receive(boolean success){
    if(success){
      this.mLoginView.navigateToMain();
    }else{
      this.mLoginView.showToast("登錄失敗");
    }
  }

  private boolean isEmpty(String text){
    return text==null||"".equals(text)?true:false;
  }
}
public class LoginActivity extends Activity implements ILoginView{
  private IPresenter mPresenter;
  private EditText mUserNameEt;
  private EditText mPasswordEt;
  private Button mSubmitBtn;
  public void onCreate(......){
    mPresenter = new PresenterImpl(this);
    mSubmitBtn.setOnClickListener(new OnClickListener(View view){
        mPresenter.login(mUserNameEt.getText().toString(),
                          mPasswordEt.getText().toString());
    });
  }

  public void showDialog(){
    //顯示一個轉圈的dialog;
  }

  public void dismissDialog(){
    //隱藏轉圈的dialog;
  }

  public void showToast(String message){
    Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
  }

  public void navigateToMain(){
    startActivity(new Intent(this,MainActivity.class));
    finish();
  }
}

3、MVVM模式

(1)、MVVM 是 Model-View-ViewModel 的簡寫。它本質上就是 MVC 的改進版。MVVM 就是將其中的 View 的狀態和行爲抽象化,讓我們將視圖 UI 和業務邏輯分開。

  • 模型層 (Model):負責從各種數據源中獲取數據;
  • 視圖層 (View):在 Android 中對應於 Activity 和 Fragment,用於展示給用戶和處理用戶交互,會驅動 ViewModel 從 Model 中獲取數據
  • ViewModel 層:用於將 Model 和 View 進行關聯,我們可以在 View 中通過 ViewModel 從 Model 中獲取數據;當獲取到了數據之後,會通過自動綁定,比如 DataBinding,來將結果自動刷新到界面上。

使用 Google 官方的 Android Architecture Components ,我們可以很容易地將 MVVM 應用到我們的應用中。下面,我們就使用它來展示一下 MVVM 的實際的應用。你可以在Github中獲取到它的源代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章