【十】python复合模式

news2024/11/15 19:43:19

10.1 复合模式简介

在前面的栏目中我们了解了各种设计模式。正如我们所看到的,设计模式可分为三大类:结构型、创建型和行为型设计模式。同时,我们还给出了每种类型的相应示例。然而,在软件实现中,模式并是不孤立地工作的。对于所有软件设计或解决方案来说,很少出现仅利用一种设计模式来实现的情况。
实际上,这些模式通常需要同时使用并加以组合,以实现特定的设计解决方案。根据GoF的定义,“复合模式将两个或更多模式组合成解决常见或普遍性问题的解决方案。复合模式不是同时使用的一组模式,而是一个问题的通用解决方案。
接下来,我们将介绍模型一视图一控制器(MVC)复合模式,该模式是复合模式的最佳示例,并且已经在许多设计解决方案中应用多年了。

10.2 模型一视图一控制器模式

MVC 模式的核心思想是将应用程序的逻辑分成三个部分:模型、视图和控制器。模型是负责数据存储和处理的部分,视图是负责数据显示的部分,控制器是负责协调模型和视图的部分。通过清晰地分离关注点,MVC 模式可以使应用程序更易于开发、测试和维护。

通常来说,人们会用网站为例来介绍MVC模式。当你浏览网站时会发生什么呢?你点击一个按钮,几个操作发生,你会看到你想要的内容。这是怎么回事?

  • 你是用户,与视图交互。视图就是提供给你的网页。你点击视图上的按钮,它告诉控制器需要做什么。
  • 控制器从视图获取输入并将其发送到模型。然后,模型会根据用户执行的操作来完成相应的动作。
  • 控制器还可以根据其从用户接收的操作(例如更改按钮,显示其他UI元素等)要求视图进行相应的改变。
  • 模型将状态变化通知视图。这可以基于一些内部变化或外部触发,例如点击按钮等。
  • 视图随后展示直接从模型获取的状态。例如,如果用户登录到网站,会给他/她呈现一个仪表板视图(登录后)。需要在仪表板中填写的所有详细信息都是由模型提供给视图的。

MVC设计模式使用以下术语一模型、视图、控制器和客户端。

  • 模型:声明一个存储和操作数据的类。
  • 视图:声明一个类来构建用户界面和显示数据。
  • 控制器:声明一个连接模型和视图的类。
  • 客户端:声明一个类,根据某些操作来获得某些结果。
  • 在这里插入图片描述
    为了进一步探讨软件开发术语所说的MVC模式,先让我们来看看MVC模式中涉及的主要类。
  • 模型类定义针对数据的所有操作(例如创建、修改和删除),并提供与数据使用方式有关的方法。
  • 视图类代表用户界面。它提供相应的方法,帮助我们根据上下文和应用程序的需要来构建 Web或GUI界面。它不应该包含自己的任何逻辑,而只应该用来显示收到的数据。
  • 控制器类从请求接收数据,并将其发送到系统的其他部分。它需要提供用于路由请求的方法。

10.3 MVC应用场景

MVC模式经常用于以下情况。

  • 当需要更改展示方式而不更改业务逻辑时。
  • 多个控制器可用于使用多个视图来更改用户界面上的展示。
    ·- 再次重申,当模型改变时,视图无需改动,因为它们是相互独立的。

10.4 MVC模式的主要作用

简而言之,MVC模式的主要有以下作用:

  • 将数据和数据的展示隔离开来。
  • 使类的维护和实现更加简单。
  • 灵活地改变数据的存储和显示方式。两者都是独立的,因此可以灵活修改。

10.5 MVC代码示例

在使用示例中,我们创建了一个 Model 对象、一个 View 对象和一个 Controller 对象。然后,通过调用 Controller 对象的 update_data() 方法,传入数据 “Hello, MVC!”,控制器会将数据设置到模型中,并通过视图显示数据。

# 模型类
class Model:
    def __init__(self):
        self._data = None

    def set_data(self, data):
        self._data = data

    def get_data(self):
        return self._data


# 视图类
class View:
    def show_data(self, data):
        print("Data: ", data)


# 控制器类
class Controller:
    def __init__(self, model, view):
        self._model = model
        self._view = view

    def update_data(self, data):
        self._model.set_data(data)
        self._view.show_data(self._model.get_data())


# 使用示例
model = Model()
view = View()
controller = Controller(model, view)

controller.update_data("Hello, MVC!")
 

10.6 MVC的优点

以下是MVC模式的优点。

  • 使用MVC,开发人员可以将软件应用程序分为3个主要部分:模型、视图和控制器。这有助于提高可维护性,强制松耦合,并降低复杂性。
  • MVC 允许对前端进行独立更改,而对后端逻辑无需任何修改或只需进行很少的更改,因此开发工作仍可以独立运行。
  • 类似地,可以更改模型或业务逻辑,而无需对视图进行任何更改。
  • 此外,可以更改控制器,而不会对视图或模型造成任何影响。
  • MVC还有助于招聘具有特定能力的人员,例如平台工程师和UI工程师,他们可以在自己的专业领域独立工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1311085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【c】数组元素移动

本题的难点之处就是不让你创建新的数组&#xff0c;而且移动的距离也没有给限制&#xff0c;比如有7个数&#xff0c;本题没有限制必须移动距离小于7&#xff0c;也可能移动的距离大于7&#xff0c;甚至更多&#xff0c;下面附上我的代码 #include<stdio.h>int main() {…

C++模板编程浅析

函数模板 声明与定义函数模板 #include <iostream> using namespace std; template <class T> void swap_new(T& a, T& b);int main() {int a 1, b 2;float c 1.5, d 3.6;swap_new(a, b);swap_new(c, d);cout << a << " " &…

【Qt5】ui文件最后会变成头文件

2023年12月14日&#xff0c;周四下午 我也是今天下午偶然间发现这个的 在使用Qt的uic&#xff08;User Interface Compiler&#xff09;工具编译ui文件时&#xff0c;会生成对应的头文件。 在Qt中&#xff0c;ui文件是用于描述用户界面的XML文件&#xff0c;而头文件是用于在…

binkw32.dll丢失怎么办?这5个方法都可以解决binkw32.dll丢失问题

binkw32.dll文件是什么&#xff1f; binkw32.dll是一个动态链接库文件&#xff0c;它是Windows操作系统中的一个重要组件。它包含了许多用于处理多媒体文件的函数和资源&#xff0c;如视频、音频等。当我们在电脑上打开或播放某些多媒体文件时&#xff0c;系统会调用binkw32.d…

刘家窑中医医院鲁卫星主任:冬季守护心脑血管,为社区居民送去健康关爱

随着冬季的来临&#xff0c;气温逐渐降低&#xff0c;心脑血管疾病的风险也随之增加。为了提高公众对心脑血管疾病的认知和预防意识&#xff0c;北京刘家窑中医医院于近日成功举办了冬季守护心脑血管公益义诊活动。 本次义诊活动主要针对社区居民中的中老年人&#xff0c;特别是…

利用闭包与高阶函数实现缓存函数的创建

缓存函数是一种用于存储和重复利用计算结果的机制。其基本思想是&#xff0c;当一个函数被调用并计算出结果时&#xff0c;将该结果存储在某种数据结构中 (通常是一个缓存对象)以备将来使用。当相同的输入参数再次传递给函数时&#xff0c;不再执行实际的计算&#xff0c;而是直…

SpringBoot的Starter自动化配置,自己编写配置maven依赖且使用及短信发送案例

目录 一、Starter机制 1. 是什么 2. 有什么用 3. 应用场景 二、短信发送案例 1. 创建 2. 配置 3. 编写 4. 形成依赖 6. 其他项目的使用 每篇一获 一、Starter机制 1. 是什么 SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂…

JVM的五大分区

1.方法区 方法区主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 2.虚拟机栈 虚拟机栈也就是我们平时说的栈内存&#xff0c;它是为java方法服务的。每个方法在执行的 时候都会创建一个栈帧&#xff0c;用于存…

SQL进阶理论篇(四):索引的结构原理(B树与B+树)

文章目录 简介如何评价索引的数据结构设计好坏二叉树的局限性什么是B树什么是B树总结参考文献 简介 我们在上一节中说过&#xff0c;索引其实是一种数据结构&#xff0c;那它到底是一种什么样的数据结构呢&#xff1f;本节将简单介绍一下几个问题&#xff1a; 什么样的数据结…

【开源Mongdb驱动】SpringBoot+Mybatis+Mongdb融合使用教程

#【开源Mongdb驱动】SpringBootMybatisMongdb无缝融合使用教程 介绍 本文介绍一款基于JAVA开源的mongodb jdbc驱动为基础的无缝与springbootmybatis融合使用案例 mongodb JDBC 使用案例 https://blog.csdn.net/gongbing798930123/article/details/135002530 《基于开源的JA…

鸿蒙原生应用/元服务开发-Stage模型能力接口(四)

一、说明 AbilityStage是HAP的运行时类。AbilityStage类提供在HAP加载的时候&#xff0c;通知开发者&#xff0c;可以在此进行该HAP的初始化&#xff08;如资源预加载&#xff0c;线程创建等&#xff09;能力。 本模块首批接口从API version 9 开始支持。后续版本的新增接口&…

Unity Web 浏览器-3D WebView中有关于CanvasWebViewPrefab

一、CanvasWebViewPrefab默认设置 这个是在2_CanvasWebViewDemo示例场景文件中可以可以查看得到&#xff0c;可以看出CanvasWebViewPrefab的默认配置如下。 二、Web 浏览器网页和Unity内置UI的渲染顺序 1、如果你勾选了以下这个Native 2D Mode选项的话&#xff0c;那么Unit…

RocketMQ Connect详解

一、概览 RocketMQ Connect是RocketMQ数据集成重要组件&#xff0c;可将各种系统中的数据通过高效&#xff0c;可靠&#xff0c;流的方式&#xff0c;流入流出到RocketMQ&#xff0c;它是独立于RocketMQ的&#xff0c;一个单独的分布式、可扩展、可容错系统&#xff0c; 它具备…

现代雷达车载应用——第2章 汽车雷达系统原理 2.1节 基本雷达功能

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.1 基本雷达功能 雷达系统通过天线或天线阵列向空间辐射电磁能量。辐射的电磁能量“照亮”周围的目标。“被照亮”的目标拦截一些辐射能量&#xff0…

LeetCode(59)反转链表 II【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 反转链表 II 1.题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&am…

东北大学Python

目前金属矿开采&#xff0c;爆破还是主要的破岩方式&#xff0c;为了保证巷道采场的安全&#xff0c;需要对爆破震动进行监测&#xff0c;获取的监测数据如附件&#xff0c;第1列数据为震动的序号&#xff0c;第2、3、4列为x,y,z三个方向的震动速度&#xff0c;往往由于各种因素…

module ‘tensorflow‘ has no attribute XXX 报错解决

问题描述&#xff1a; 粘了别人的tensorflow项目&#xff0c;运行总是报错module ‘tensorflow’ has no attribute什么什么 问题解决&#xff1a; 导入tensorflow的代码如下 import tensorflow as tf此时&#xff0c;某个某块报错&#xff0c;比如下面这个 那么就直接把tf.…

100:ReconFusion: 3D Reconstruction with Diffusion Priors

简介 官网 少样本重建必然导致nerf失败&#xff0c;论文提出使用diffusion模型来解决这一问题。从上图不难看出&#xff0c;论文一步步提升视角数量&#xff0c;逐步与Zip-NeRF对比。 实现流程 Diffusion Model for Novel View Synthesis 给定一组输入图像 x o b s { x i…

Tomcat部署(图片和HTML等)静态资源时遇到的问题

文章目录 Tomcat部署静态资源问题图中HTML代码启动Tomcat后先确认Tomcat是否启动成功 Tomcat部署静态资源问题 今天&#xff0c;有人突然跟我提到&#xff0c;使用nginx部署静态资源&#xff0c;如图片。可以直接通过url地址访问&#xff0c;为什么他的Tomcat不能通过这样的方…

卧槽!jmeter 竟然这么牛逼,压测爽歪歪~

# Http请求模拟 1、新建线程组 操作&#xff1a;鼠标右键测试计划 -> 添加 -> Threads(Users) -> 线程组 -> 修改测试计划名称 新建线程组 2、添加取样器HTTP请求 操作&#xff1a;鼠标右键线程组 -> 添加 -> Sampler -> HTTP请求 -> 填写请求参数 添…