MVC、MVP、MVVM 都是在 Android 開發(fā)中經(jīng)常用到的架構思想,它們都是為了更好地分離代碼、提高代碼可復用性、方便維護等目的而設計的。下面對這三種架構思想進行簡單的介紹和比較。
MVC 架構是最早被使用的一種架構,它把程序分成了三個部分:模型(Model)、視圖(View)和控制器(Controller)。模型負責存儲數(shù)據(jù)和業(yè)務邏輯,視圖負責顯示數(shù)據(jù),控制器負責接收用戶的輸入和調用模型以及視圖。
MVC 的優(yōu)點是模型和視圖分離,降低了耦合性,提高了代碼的可維護性和可復用性。

在MVC架構中,Activity充當了Controller的角色,負責處理用戶的操作和業(yè)務邏輯,并將數(shù)據(jù)傳遞給View進行顯示。Model則負責數(shù)據(jù)的獲取和處理。
以下是一個簡單的MVC架構的示例代碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mTextView;
private Button mButton;
private Model mModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.textView);
mButton = findViewById(R.id.button);
mButton.setOnClickListener(this);
mModel = new Model();
}
@Override
public void onClick(View view) {
String data = mModel.getData();
mTextView.setText(data);
}
}
public class Model {
public String getData() {
return "Hello, MVC!";
}
}
在這個例子中,MainActivity作為Controller,通過監(jiān)聽按鈕點擊事件,從Model中獲取數(shù)據(jù)并將其顯示在TextView中。
MVP
MVP 架構是在 MVC 架構的基礎上發(fā)展而來的。它把程序分成了三個部分:模型(Model)、視圖(View)和展示器(Presenter)。模型負責存儲數(shù)據(jù)和業(yè)務邏輯,視圖負責顯示數(shù)據(jù),展示器負責接收用戶的輸入和調用模型以及視圖。
MVP 的優(yōu)點是模型和視圖的解耦,通過展示器來協(xié)調模型和視圖之間的交互,提高了代碼的可維護性和可復用性。

MVP架構實戰(zhàn)代碼
在MVP架構中,View和Model分別負責UI和數(shù)據(jù)的處理,Presenter充當了中間層的角色,負責處理View和Model之間的交互,并將結果傳遞給View進行顯示。
以下是一個簡單的MVP架構的示例代碼:
class MainActivity extends AppCompatActivity implements MainContract.View, View.OnClickListener {
private TextView mTextView;
private Button mButton;
private MainPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.textView);
mButton = findViewById(R.id.button);
mButton.setOnClickListener(this);
mPresenter = new MainPresenter(this, new Model());
}
@Override
public void onClick(View view) {
mPresenter.loadData();
}
@Override
public void showData(String data) {
mTextView.setText(data);
}
}
public class MainPresenter implements MainContract.Presenter {
private MainContract.View mView;
private Model mModel;
public MainPresenter(MainContract.View view, Model model) {
mView = view;
mModel = model;
}
@Override
public void loadData() {
String data = mModel.getData();
mView.showData(data);
}
}
public interface MainContract {
interface View {
void showData(String data);
}
interface Presenter {
void loadData();
}
}
public class Model {
public String getData() {
return "Hello, MVP!";
}
}
在這個例子中,MainActivity作為View,通過按鈕點擊事件通知Presenter進行數(shù)據(jù)加載并將結果傳遞給View進行顯示。
MVVM
MVVM 架構是比較新的一種架構,它把程序分成了三個部分:模型(Model)、視圖(View)和視圖模型(ViewModel)。模型負責存儲數(shù)據(jù)和業(yè)務邏輯,視圖負責顯示數(shù)據(jù),視圖模型負責協(xié)調模型和視圖之間的交互。
MVVM 的優(yōu)點是通過數(shù)據(jù)綁定機制實現(xiàn)了模型和視圖的自動更新,降低了代碼的復雜度,提高了代碼的可維護性和可復用性。
總之,MVC、MVP 和 MVVM 都有各自的優(yōu)點,我們在實際開發(fā)中可以根據(jù)項目的需求來選擇不同的架構。
MVVM架構實戰(zhàn)代碼

首先,我們定義一個數(shù)據(jù)模型 User,它包含了用戶的姓名和年齡信息:
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
接下來,我們定義一個 ViewModel,它負責處理數(shù)據(jù)邏輯,包括從數(shù)據(jù)源獲取數(shù)據(jù)、數(shù)據(jù)的轉換等:
class UserViewModel extends ViewModel {
private MutableLiveData<User> userLiveData;
public LiveData<User> getUserLiveData() {
if (userLiveData == null) {
userLiveData = new MutableLiveData<>();
loadUser();
}
return userLiveData;
}
private void loadUser() {
// 從數(shù)據(jù)源獲取數(shù)據(jù)
User user = new User("張三", 18);
// 將數(shù)據(jù)轉換為可觀察的 LiveData
userLiveData.setValue(user);
}
}
在 ViewModel 中,我們使用 LiveData 來包裝數(shù)據(jù),從而將數(shù)據(jù)轉換為可觀察的數(shù)據(jù)。當數(shù)據(jù)發(fā)生變化時,LiveData 會通知它的[觀察者
最后,我們在 Activity 中使用 ViewModel 來獲取數(shù)據(jù):
class MainActivity extends AppCompatActivity {
private TextView nameTextView;
private TextView ageTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameTextView = findViewById(R.id.name_text_view);
ageTextView = findViewById(R.id.age_text_view);
// 獲取 UserViewModel 實例
UserViewModel userViewModel = new ViewModelProvider(this).get(UserViewModel.class);
// 觀察 LiveData
userViewModel.getUserLiveData().observe(this, user -> {
nameTextView.setText(user.getName());
ageTextView.setText(String.valueOf(user.getAge()));
});
}
}
在 Activity 中,我們使用 ViewModelProvider 來獲取 ViewModel 的實例。然后,我們使用 observe() 方法來觀察 LiveData,當 LiveData 中的數(shù)據(jù)發(fā)生變化時,我們會收到通知,并更新 UI。全文主要對Android架構中的MVC、MVP、MVVM的原理解析,加上一些代碼的示例。
總結
MVC、MVP、MVVM 都是經(jīng)典的[前端架構]設計思想,其目的是為了更好地分離數(shù)據(jù)、業(yè)務邏輯和 UI,并且便于代碼的復用和維護。其中:
- MVC(Model-View-Controller)模式中,模型(Model)表示應用程序核心(數(shù)據(jù)和業(yè)務邏輯),視圖(View)顯示數(shù)據(jù)(模型)并處理用戶交互,控制器(Controller)處理用戶交互并更新模型和視圖。典型的例子是 Android 中的 Activity。
- MVP(Model-View-Presenter)模式將控制器(Controller)改成了Presenter,它與View進行交互并處理業(yè)務邏輯,而View只負責顯示數(shù)據(jù)并將用戶交互傳遞給Presenter,Model(模型)與 Presenter 沒有直接交互,而是通過Presenter來進行數(shù)據(jù)交換。典型的例子是Android中的 RecyclerView 和 Adapter。
- MVVM(Model-View-ViewModel)是一種新的設計模式它是基于 MVP 模式的改進版,通過數(shù)據(jù)綁定(Data Binding)來實現(xiàn) View 和 ViewModel 的同步更新,同時 View 和 ViewModel 之間通過接口進行通信。典型的例子是Android中的 Jetpack 和 Kotlin。
每種架構都有其優(yōu)缺點和應用場景,需要根據(jù)實際需求進行選擇。在實際開發(fā)中,我們可以根據(jù)不同的需求選擇不同的架構設計思想,以便更好地實現(xiàn)的效率和代碼質量。