什么是MVC设计模式,以及MVC设计模式又怎样的优缺点.

MVC 设计模式

优点

  • 同步开发 - 多个开发人员可以同时处理模型,控制器和视图。由于MVC将应用程序的各个组件分离,因此开发人员能够在不同组件上并行工作,而不会相互影响或阻塞。例如,团队可能会将开发人员分为前端和后端。后端开发人员可以设计数据结构以及用户如何与之交互,而无需完成用户界面。相反,前端开发人员能够在数据结构可用之前设计和测试应用程序的布局。
  • 代码重用 - 通过创建彼此独立的组件,开发人员能够在其他应用程序中快速轻松地重用组件。对于具有不同数据的另一个应用程序,可以为一个应用程序重构相同(或类似)的视图,因为视图只是处理数据如何显示给用户。
  • 高内聚 - MVC可以在控制器上对相关操作进行逻辑分组。特定模型的视图也组合在一起。
  • 低耦合 - MVC框架的本质是模型,视图或控制器之间的耦合较低。
  • 易于修改 - 由于责任分离,未来的开发或修改更容易。
  • 模型的多个视图 - 模型可以有多个视图。

缺点

  • 显着的学习曲线 - 关于多种技术的知识成为常态。使用MVC的开发人员需要熟练掌握多种技术。
  • 代码导航 - 框架导航可能很复杂,因为它引入了新的抽象层,并要求用户适应MVC的分解标准。
  • 多伪影一致性 - 将特征分解为三个伪影会导致散射。因此,要求开发人员一次保持多个表示的一致性。

简易计算器的实现

新建项目

文件夹中各个文件的作用

  • .pro文件:跨平台性的实质所在,其中记录着项目中的所有信息,来到不同的平台下依据该文件生成相同功能效果的可执行程序。
  • mainwindom.h文件:类的声明
  • main.cpp 文件
  • mainwindow.cpp文件:类的定义
  • .ui文件:界面文件,有两种编辑形式,一种是利用Qt Designer设置部件,另一种是以代码的形式

界面设计

main.h文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef EXPR_H
#define EXPR_H

#include <QDialog>
#include "QString"
#include "model.h"
namespace Ui {
class expr;
}

class expr : public QDialog
{
Q_OBJECT

public:
explicit expr(QWidget *parent = nullptr);
~expr();

private:
Ui::expr *ui;
model *mode;
QString tmp;
private slots:
void on_btn_0_clicked();
void on_btn_1_clicked();
void on_btn_2_clicked();
void on_btn_3_clicked();
void on_btn_4_clicked();
void on_btn_5_clicked();
void on_btn_6_clicked();
void on_btn_7_clicked();
void on_btn_8_clicked();
void on_btn_9_clicked();
void on_btn_plus_clicked();
void on_btn_min_clicked();
void on_btn_mul_clicked();
void on_btn_div_clicked();
void on_btn_clear_clicked();
void on_btn_equal_clicked();
};

#endif // EXPR_H

mainwindow.cpp文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "expr.h"
#include "ui_expr.h"
#include "QString"
#include "QDebug"
#include "QDialog"

expr::expr(QWidget *parent) :
QDialog(parent),
ui(new Ui::expr)
{
ui->setupUi(this);
this->mode = new model;
this->tmp="";
}

expr::~expr()
{
delete ui;
}
void expr::on_btn_0_clicked()
{
if(this->tmp != "")
{
this->tmp+="0";
this->ui->lbl_display->setText(this->tmp);
}
}

void expr::on_btn_1_clicked()
{
this->tmp+="1";
qDebug()<<this->tmp;
this->ui->lbl_display->setText(this->tmp);
}

void expr::on_btn_2_clicked()
{
this->tmp+="2";
this->ui->lbl_display->setText(this->tmp);
}
void expr::on_btn_3_clicked()
{
this->tmp+="3";
this->ui->lbl_display->setText(this->tmp);
}

void expr::on_btn_4_clicked()
{
this->tmp+="4";
this->ui->lbl_display->setText(this->tmp);
}

void expr::on_btn_5_clicked()
{
this->tmp+="5";
this->ui->lbl_display->setText(this->tmp);
}

void expr::on_btn_6_clicked()
{
this->tmp+="6";
this->ui->lbl_display->setText(this->tmp);
}

void expr::on_btn_7_clicked()
{
this->tmp+="7";
this->ui->lbl_display->setText(this->tmp);
}

void expr::on_btn_8_clicked()
{
this->tmp+="8";
this->ui->lbl_display->setText(this->tmp);
}

void expr::on_btn_9_clicked()
{
this->tmp+="9";
this->ui->lbl_display->setText(this->tmp);
}

void expr::on_btn_plus_clicked()
{
int num = this->tmp.toInt();
qDebug()<<"Num1="<<num;
this->mode->setNum1(num);
this->tmp = "";
QString ex = this->ui->btn_plus->text();
this->mode->setFlag(ex);
}

void expr::on_btn_min_clicked()
{
int num = this->tmp.toInt();
qDebug()<<"Num1="<<num;
this->mode->setNum1(num);
this->tmp = "";
QString ex = this->ui->btn_min->text();
this->mode->setFlag(ex);
}

void expr::on_btn_mul_clicked()
{
int num = this->tmp.toInt();
qDebug()<<"Num1="<<num;
this->mode->setNum1(num);
this->tmp = "";
QString ex = this->ui->btn_mul->text();
this->mode->setFlag(ex);
}

void expr::on_btn_div_clicked()
{
int num = this->tmp.toInt();
qDebug()<<"Num1="<<num;
this->mode->setNum1(num);
this->tmp = "";
QString ex = this->ui->btn_div->text();
this->mode->setFlag(ex);
}

void expr::on_btn_clear_clicked()
{
this->tmp = "";
this->ui->lbl_display->setText("0");
}

void expr::on_btn_equal_clicked()
{
int num = this->tmp.toInt();
qDebug()<<"Num2="<<num;
this->mode->setNum2(num);
QString res = this->mode->doExpr();
qDebug()<<res;
this->ui->lbl_display->setText(res);
this->tmp = "";
}

main.cpp

1
2
3
4
5
6
7
8
9
10
11
#include "expr.h"
#include <QApplication>
#include "QDialog"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
expr w;
w.show();
return a.exec();
}

创建一个Model模型

  • model的声明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef MODEL_H
#define MODEL_H
#include "QString"

class model
{
private:
int num1;
int num2;
//int result;
QString flag;
public:
model();
void setNum1(int num);
void setNum2(int num);
void setFlag(QString flag);
QString doExpr();
};

#endif // MODEL_H
  • model的定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "model.h"
#include "QString"

model::model()
{

}
void model::setNum1(int num)
{
this->num1 = num;
}
void model::setNum2(int num)
{
this->num2 = num;
}
void model::setFlag(QString flag)
{
this->flag = flag;
}
QString model::doExpr()
{
int result = 0;
if(this->flag == "+")
{
result = this->num1 + this->num2;
}else if(this->flag == "-")
{
result = this->num1 - this->num2;
}
else if(this->flag == "*")
{
result = this->num1 * this->num2;
}else if(this->flag == "/")
{
if(this->num2 == 0){
return "ERROR";
}
result = this->num1 / this->num2;
}else{
return QString::number(this->num1);
}
return QString::number(result);
}

待续