天天看點

mvc mvp mvvm了解

摘錄:MVP/MVC等架構的出現與發展都是為了解決大型軟體中界面邏輯代碼與功能邏輯代碼相混合而産生的。而為了實作MVP/MVC等架構的時候,就需要在基本的代碼中加入構架相關的代碼。是以不适用于簡單的工具類軟體使用。比如做一個基礎的“序列槽小助手工具”如果使用了MVP/MVC等架構,代碼看起來反而複雜了。而在稍大一些軟體中,使用MVP/MVC等架構,則可以帶來“磨刀不誤砍材功”體驗。

  1. mvc中controller比較臃腫,會包含view的部分,view和model無法解耦在安卓中,model=資料操作(網絡請求,資料庫等),view=xml檔案,controller=activity
  2. mvp,将mvc中的view controller合成view,再加一個presenter,model=資料操作(網絡請求,資料庫等) ,view=xml+activity,presenter = 接口層,這個模式可以解耦model和view層,view去實作定義好的接口,而在對應的presenter中通過接口調用方法,此外,編寫單元測試的時候可以額外編寫測試view,然後對presenter接口進行測試,這個在mvc中是無法完成的。隻需定義好 View 與 Presenter 的接口,即可實作 UI 與業務邏輯獨立開發,可由不同的開發團隊分别實作。
  3. mvp的缺點①如果邏輯很複雜的頁面,接口很多,維護接口的成本就很大,②Presenter 對 Activity 與 Fragment 的生命周期是無感覺的,是以我們需要手動添加相應的生命周期方法,并進行特殊處理,以避免出現異常或記憶體洩露。
  4. mvvm(Model-View-ViewModel)中的vm是viewmodel的意思,解決了資料自動重新整理的問題,mvvm的問題和mvc有點像,data binding架構雖然解決了資料綁定的問題,但view層太重了

qt mvp實作

// mainwindow.h
// 實作view接口
class MainWindow : public QMainWindow , public MainContract::View
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow() override;

private slots:
    void on_pushButtonIncrease_clicked();

    void on_pushButtondecress_clicked();

private:
    void ShowResultMsg(QString msg) override;

private:
    Ui::MainWindow *ui;
    MainPresenter *presenter_p;
};
#endif // MAINWINDOW_H           
// mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    presenter_p = new MainPresenter(this);

    ui->setupUi(this);
    ui->label_value->setText("0");
}

MainWindow::~MainWindow()
{
    delete ui;
    delete presenter_p;
}

void MainWindow::ShowResultMsg(QString msg) {
    ui->label_value->setText(msg);
}

void MainWindow::on_pushButtonIncrease_clicked()
{
    presenter_p->IncreaseValue();
}

void MainWindow::on_pushButtondecress_clicked()
{
    presenter_p->DecreaseValue();
}           
//  maincontract.h 定義view接口和presenter接口
class MainContract
{
public:
    //view interface
    class View {
    public:
        virtual ~View(){};
        virtual void ShowResultMsg(QString msg) =0;
    };

    //presenter interface
    class Presenter : public QObject {
    public:
        virtual ~Presenter(){};
        virtual void IncreaseValue() = 0;
        virtual void DecreaseValue() = 0;
    };
};

#endif // MAINCONTRACT_H           
// 實作presenter接口
// mainpresenter.h
#include "maincontract.h"

class MainPresenter : public MainContract::Presenter
{
    Q_OBJECT
public:
    MainPresenter(MainContract::View *v);
    ~MainPresenter() override;

    void IncreaseValue() override;
    void DecreaseValue() override;

private:
    Q_DISABLE_COPY(MainPresenter)
    MainContract::View *v_p;
    int value_;
};           
// mainpresenter.cpp
#include "mainpresenter.h"

MainPresenter::MainPresenter(MainContract::View *v)
{
    v_p = v;
    value_ = 0;
}

MainPresenter::~MainPresenter() {

}

void MainPresenter::IncreaseValue() {
    value_ ++;
    v_p->ShowResultMsg(QString::number(value_));
}

void MainPresenter::DecreaseValue() {
    value_ --;
    v_p->ShowResultMsg(QString::number(value_));
}