设计模式系列之MVC模式

news/2024/7/8 8:31:18

这里写自定义目录标题

    • 1、设计模式概要
      • 最基本的设计模式
      • 使用设计模式的好处
    • 2、MVC模式
      • MVC实例:
        • 模型 models.py
        • 视图views.py
        • 控制器 Controller.py
      • 3、优缺点总结

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

视图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!')

控制器 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()

3、优缺点总结

优点 :

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

缺点 :

  • 对于简单的界面,增加了系统结构和实现的复杂性。
  • 视图与控制器间的过于紧密的连接。
  • 视图对模型数据的低效率访问
  • 目前,一般高级的界面工具或构造器不支持模式。

http://lihuaxi.xjx100.cn/news/126148.html

相关文章

Motifs与Graphlets

目录 引入 Subgraphs Network motifs 1.定义 2. 检测motifs 3.motifs 概念的变体 graphlets 如何找到modifs与graphlets 引入 Subnetworks是构建网络的模块,它们可以表征网络的结构与区分不同的网络。 下图中的子图是(每一个和其他的都不同)异构的&#x…

仙人掌之歌——权力的游戏(1)

直播架构是怎么回事儿 “老陈,老陈,正忙呢,有空不,有空不?” 陈速听到后面有人叫着自己,语速挺快,声音听着还有些耳熟。回头一看,原来是易伟成这哥们。陈速心中不免诧异&#xff0c…

磁盘分区和NFS实验

磁盘分区 实验要求: 创建一个逻辑卷 请按下列要求创建一个新的逻辑卷: 创建一个名为 datastore 的卷组,卷组的大小为4G 逻辑卷的名字为 database ,所属卷组为 datastore,该逻辑卷大小为3G 将新建的逻辑卷格式化为 xfs 文件系统通过自动挂载…

黑马程序员C++类和对象【5】 —— 运算符重载(蓝桥杯必备知识)万字超详解

目录 🤡加号运算符重载 🤡左移运算符重载 🤡递增运算符重载 🤡递减运算符重载 🤡赋值运算符重载 🤡关系运算符重载 🤡函数调用运算符重载(仿函数) 🤡加…

基于Django框架的零食商城系统之Python毕设选题推荐

💖💖作者:IT跃迁谷毕设展 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等。平常会做一些项目定制化开发…

Java高级 线程

目录 一、什么是进程 二、什么是线程 三、进程和线程的区别 四、线程的组成 五、线程的组成 六、线程的特点 七、如何创建多线程 7.1 通过继承Thread实现多线程 ​编辑 7.2 获取和设置线程的名称 7.3 通过实现Runnable接口完成多线程 示例一:使用线程Thread类实现4个窗…

源码解析---net包

写在前面 并不是对net包所有内容解析,只是对常用的函数等相关部分进行一定程度的解剖 引子 import ("fmt""net/http" ) func main() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("…

近似法概率潮流

通常潮流计算仅针对单一的系统运行方式。网络拓扑结构、变压器变比、节点注入功率等都是给定的。而在实际的电力系统运行过程中存在着诸多不确定性因素,例如负荷功率和发电机出力随时都在变化,网络结构由于故障或检修也会改变,以及测量和估计…