Posts 设计模式-MVC模式
Post
Cancel

设计模式-MVC模式

概念解析

MVC模式为软件工程中的一种常用软件架构模式,但是并没有一个标准的定义,通常来将其将软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

  • M:负责数据存储
  • V:负责数据显示
  • C:负责与用户的交互逻辑。

MVC模式类图如下:

img

优点:

  • 低耦合性,软件分层,可以独立发展,方便团队合作,快速开发
  • 高重用性和可适用性:适用于各类场景名,如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,图像内容:美丽的建筑图像
    """
This post is licensed under CC BY 4.0 by the author.

设计模式-回调机制

设计模式-设计原则