android mvc、mvp、mvvm架構模式

MVC、MVP、MVVM 都是在 Android 開發(fā)中經(jīng)常用到的架構思想,它們都是為了更好地分離代碼、提高代碼可復用性、方便維護等目的而設計的。下面對這三種架構思想進行簡單的介紹和比較。

MVC 架構是最早被使用的一種架構,它把程序分成了三個部分:模型(Model)、視圖(View)和控制器(Controller)。模型負責存儲數(shù)據(jù)和業(yè)務邏輯,視圖負責顯示數(shù)據(jù),控制器負責接收用戶的輸入和調用模型以及視圖。

MVC 的優(yōu)點是模型和視圖分離,降低了耦合性,提高了代碼的可維護性和可復用性。


image.png

在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é)調模型和視圖之間的交互,提高了代碼的可維護性和可復用性。


image.png

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)代碼

image.png

首先,我們定義一個數(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)的效率和代碼質量。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容