概念解析
MVC模式为软件工程中的一种常用软件架构模式,但是并没有一个标准的定义,通常来将其将软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
- M:负责数据存储
- V:负责数据显示
- C:负责与用户的交互逻辑。
MVC模式类图如下:
优点:
- 低耦合性,软件分层,可以独立发展,方便团队合作,快速开发
- 高重用性和可适用性:适用于各类场景名,如Web端、移动端、桌面端等
- 快速开发、部署,现有很多现成框架都是基于MVC模式的
应用场景:
- 互联网场景应用广泛,如:前后端的分离,甚至前后端内部的各自分离
- 基于MVC的延伸扩展:MVP(Model-View-Presenter)模式,其中P为presenter,该模式下Model和View的所有交互都通过P角色来传递,解耦得更充分;MVVM(Model-View-ViewModel)模式,ViewModel指的是Model of View,其特点是通过“双向数据绑定”来实现View和Model数据同步“自动化”。
实例分析
提供一个简单的例子:相机功能设计,数据存储由SD卡模块实现,数据可视化由显示器实现,机身实现整体相机功能的控制:
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import random
class Camera():
"""相机机身"""
# 相机基本参数
single_focus = "单点对焦"
area_focus = "区域对焦"
big_area_focus = "大区域对焦"
focus45 = "45点自动对焦"
def __init__(self, name):
self.__name = name
sefl.__apertune = 0.0 # 光圈
self.__shutter_speed = 0 # 快门速度
self.__light_sensitivity = 0 # 感光度
self.__lens = Lens() # 静态
self.__sd_card = SDCard() # SD卡
self.__display = Display() # 显示器
def shooting(self):
"""拍照"""
print("[开始拍摄中")
image_lighting = self.__lens.collecting()
image = self.__transfer_image(image_lighting)
self.__sd_card.add_image(image)
print("拍摄完成]")
def view_image(self, index):
"""查看图像"""
print("查看第%d张图像:" % (index + 1))
image = self.__sd_card.get_image(index)
self.__display.show_image(image)
def __transfer_image(self, image_lighting):
"""将光线信号存储为数字信号:简单模拟"""
print("接收光线并处理成数字信号")
return Image(6000, 4000, image_lighting)
def setting(self, aperture, shutter_speed, light_sensitivity):
"""设置相机的拍摄属性:光圈、快门、感光度"""
self.__aperture = aperture
self.__shutter_speed = shutter_speed
self.__light_sensitivity = light_sensitivity
def focusing(self, focus_mode):
"""对焦:通过镜头组件实现"""
self.__lens.set_focus(focus_mode)
def show_info(self):
"""显示相机属性"""
print("%s 的设置 光圈:F%0.1f 快门:1/%d 感光度:ISO %d" %
(self.__name, self.__aperture, self.__shutter_speed, self.__light_sensitivity))
class Lens():
"""镜头"""
def __init__(self):
self.__focus_mode = ''
self.__scenes = {
0: '风光',
1: '生态',
2: '人文',
3: '纪实',
4: '人像',
5: '建筑',
}
def set_focus(self, focus_mode):
self.__focus_mode = focus_mode
def collect(self):
"""图像采集:随机模拟"""
print("采集光线:%s" % self.__focus_mode)
index = random.randint(0, len(self.__scenes) - 1)
scene = self.__scenes[index]
return "美丽的" + scene + " 图像"
class Display():
"""显示器"""
def show_image(self, image):
print("图片大小: %d x %d 图片内容:%s" % (image.get_width(), image.get_height(), image.get_pix()))
class SDCard():
"""SD存储卡"""
def __init__(self):
self.__images = []
def add_image(self, image):
print("存储图像")
self.__images.append(image)
def get_image(self, index):
if index >= 0 and index < len(self.__images):
return self.__images[index]
else:
return None
class Image():
"""图像:字符串替代像素内容"""
def __init__(self, width, height, pixels):
self.__width = width
self.__height = height
self.__pixels = pixels
def get_width(self):
return self.__width
def get_height(self):
return self.__height
def get_pix(self):
return self.__pixels
def test_camera():
camera = Camera("EOS 80D")
camera.setting(3.5, 60, 200)
camera.show_info()
camera.focusing(Camera.big_area_focus)
camera.shooting()
camera.setting(5.6, 720, 100)
camera.show_info()
camera.focusing(Camera.focus45)
camera.shooting()
camera.view_image(0)
camera.view_image(1)
"""
测试结果:
EOS 80D的设置 光圈:F3.5 快门:1/60 感光度:ISO 200
[开始拍摄中
采集光线,大区域对焦
接收光线并处理成数字信号
存储图像
拍摄完成
]
EOS 80D的设置 光圈:F5.6 快门:1/720 感光度:ISO 100
[开始拍摄中
采集光线,45点自动对焦
接收光线并处理成数字信号
存储图像
拍摄完成
]
查看第1张图像:
图片大小:6000 x 4000,图像内容:美丽的风光图像
查看第2张图像:
图片大小:6000 x 4000,图像内容:美丽的建筑图像
"""