• 设计模式系列之MVC模式


    1、设计模式概要

    定义: 设计模式是由众多的软件开发人员经过长期的积累,不断试错改进,总结出来的最佳解决方案。是软件开发人员解决某类问题的最佳实践,它经常被有经验的软件开发人员在开发过程中所采用。

    最基本的设计模式

    • 创建型模式:提供实例化的方法,为适合的状况提供相应的对象创建方法。
    • 结构型模式:通常用来处理实体之间的关系,使得这些实体能够更好地协同工作。
    • 行为型模式:用于在不同的实体建进行通信,为实体之间的通信提供更容易,更灵活的通信方法。

    使用设计模式的好处

    • 模式为开发人员提供了针对特定问题的经过尝试和测试的解决方案的选择。
    • 所有设计模式都是与语言无关的
    • 模式有助于实现沟通并维护良好的文档。
    • 它包括成就记录,以减少项目的任何技术风险。
    • 设计模式使用起来非常灵活并且易于理解

    2、MVC模式

    MVC模式,即模型-视图-控制器模式,也是最常用的设计模式。开发人员发现实现这种设计模式很容易。

    MVC设计模式
    该模式下由三部分组成
    模型model:它由与数据库交互的纯应用程序逻辑组成。它包含了所有可以向最终用户表示数据的信息。
    试图views:视图表示与最终用户交互的HTML文件。它向用户表示模型的数据。
    控制器 controller : 它充当视图和模型之间的中介。它监听由视图和查询模型触发的事件

    MVC实例:

    模型 models.py

    它需要一个方法,该方法可获取数据库中Person表的所有记录。记录以JSON格式显示。
    模型主要包括业务逻辑模块和数据模块,与数据格式无关。可以被多个视图重用

    # -*- coding:utf-8 -*- 
    # filename: mvc_model设计模式中model
    # data: 
    import sys
    import json
    
    class Person(object):
        '''该方法可获取数据库中Person表的所有记录。记录以JSON格式显示'''
        def __init__(self,first_name = None,last_name = None):
            self.first_name = first_name
            self.last_name = last_name
    
        def name(self):
            '''返回人名'''
            return (" %s %s " %(self.first_name,self.last_name))
    
        @classmethod  # 类方法的定义  类名.函数名
        def getAll(self):
            '''获取所有的人作为person对象的列表'''
            database = open(sys.path[0]+ r'\db.txt','r')
            result = []
            json_list = json.loads(database.read())
    
            for item in json_list:
                item = json.loads(item)
                person = Person(item['first_name'],item['last_name'])
                result.append(person)
            return result
    
    
    • 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
    视图views.py

    它显示在模型内获取的所有记录。视图从不与模型交互;控制器完成这项工作(与模型和视图进行通信)

    # -*- coding:utf-8 -*- 
    # filename: mvc_model设计模式中model
    # function :显示在模型内获取的所有记录。视图从不与模型交互;控制器完成这项工作(与模型和视图进行通信)
    # data: 
    
    from models import Person
    
    def showAllView(list):
       print ('in our db we have %i users. Here they are:' % len(list))
       for item in list:
          print (item.name())
    
    def startView():
       print ('MVC - the simplest example')
       print ('Do you want to see everyone in my db?[y/n]')
    
    def endView():
       print ('Goodbye!')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    控制器 Controller.py

    Controller通过 getAll()方法与模型进行交互,该方法将获取显示给最终用户的所有记录。
    功用:控制器(controller)接收来自界面的请求 并交给模型进行处理

    # -*- coding:utf-8 -*- 
    # filename: mvc_model设计模式中控制器
    # function : 通过 getAll()方法与模型进行交互,该方法将获取显示给最终用户的所有记录。
    # data: 2022-11-01
    
    from models import Person
    import views
    
    
    def showAll():
        #获取所有的person对象的列表y
        peoples = Person.getAll()
        #调用视图
        return views.showAllView(peoples)
    
    def start():
        views.startView()
        inputs = input()
        if inputs == 'y':
            return showAll()
        else:
            return views.endView()
    
    if __name__ == "__main__":
        #开始运行控制器
        start()
    
    • 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

    3、优缺点总结

    优点 :

    • 实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。
    • 有利于分工合作。,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可进行开发视图层中的 JSP,而对业务熟悉的人员可开发业务层,而其他开发人员可开发控制层。
    • 有利于组件的重用。如控制层可独立成一个能用的组件,可以为一个模型在运行时同时建立和使用多个视图。

    缺点 :

    • 对于简单的界面,增加了系统结构和实现的复杂性。
    • 视图与控制器间的过于紧密的连接。
    • 视图对模型数据的低效率访问
    • 目前,一般高级的界面工具或构造器不支持模式。
  • 相关阅读:
    PT Application Inspector 现支持集成开发环境
    数据同步工具DataX介绍和原理
    冒泡排序(Bubble Sort)
    纯手写http服务器
    理解系统内核linux phy驱动
    实现多线程的4种方式
    Opencv形态学——腐蚀、膨胀、开运算与闭运算、梯度运算、礼帽、黑帽
    SpringBoot项目--电脑商城【收货地址列表展示和设置默认地址】
    Yolov5项目中关闭wandb
    金仓数据库 KingbaseGIS 使用手册(6.5. 几何对象编辑函数)
  • 原文地址:https://blog.csdn.net/cy15625010944/article/details/127639015