MVC模式全解析

MVC 模式:概念与架构基石

在软件开发的广袤宇宙中,MVC 模式宛如一颗璀璨的恒星,照亮了无数开发者前行的道路。它是一种经典的软件架构模式,全称为 Model - View - Controller,即模型 - 视图 - 控制器 ,将应用程序清晰地划分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。这种架构方式犹如为程序搭建了一个稳固的骨架,使得代码的组织和管理更加高效,也为团队协作开发提供了便利。在实际应用中,无论是小型的 Web 应用,还是大型的企业级系统,MVC 模式都有着广泛的应用,它能够有效地提高代码的可维护性、可扩展性和可复用性,让开发过程更加流畅和高效。

模型(Model):数据与逻辑的核心

数据管理与业务逻辑

模型作为 MVC 模式的核心,肩负着管理应用程序数据和实现业务逻辑的重任 。它就像是一个智能仓库,不仅存储着各种关键数据,还能按照既定的业务规则对这些数据进行高效处理。在一个电商系统中,商品数据就是模型管理的重要部分。商品的基本信息,如名称、价格、库存数量等,都被精心存储在模型中。而商品的添加、修改、删除以及库存的增减等操作,都由模型中的业务逻辑来实现。比如,当有新商品上架时,模型会按照预设的业务规则,将商品信息准确无误地存储到数据库中,并进行必要的数据校验,确保数据的完整性和准确性。 再如,当商品库存发生变化时,模型会根据业务逻辑自动更新库存数据,并触发相应的事件通知相关组件,以保证整个系统的数据一致性。 这种对数据和业务逻辑的集中管理,使得模型成为了应用程序稳定运行的基石,为视图和控制器提供了坚实的数据支持和业务逻辑保障。

独立于视图与控制器

模型的一个显著特点是其独立性,它与视图和控制器保持着清晰的界限,相互之间的耦合度极低 。这意味着,当模型发生变化时,比如业务逻辑的调整或者数据结构的优化,并不会对视图和控制器产生直接的影响。同样,视图和控制器的修改也不会干扰到模型的正常工作。以数据库迁移为例,当应用程序需要更换数据库或者对数据库结构进行重大调整时,只需要在模型层进行相应的修改。比如,将原本使用的 MySQL 数据库迁移到 PostgreSQL 数据库,模型层可以独立完成数据库连接、数据迁移和业务逻辑适配等工作,而视图依然可以按照原来的方式展示数据,控制器也能继续正常地处理用户请求,无需进行大规模的改动。 这种独立性极大地提高了代码的可维护性和可扩展性,使得开发人员可以更加专注地对模型进行优化和升级,而不用担心对其他组件造成不必要的影响。 同时,也为团队协作开发提供了便利,不同的开发人员可以分别负责模型、视图和控制器的开发,提高开发效率和代码质量。

视图(View):用户交互的窗口

数据可视化呈现

视图作为 MVC 模式中与用户直接交互的部分,就像是一扇展示信息的窗口,其主要职责是将模型中的数据以直观、友好的用户界面形式呈现给用户 。在 Web 应用中,视图可能是一个精美的 HTML 页面,通过各种前端技术,如 CSS 样式和 JavaScript 交互效果,将数据以表格、图表、列表等形式展示出来,让用户能够一目了然地获取所需信息。在 APP 应用中,视图则表现为各种界面元素,如按钮、文本框、图片等,它们共同构成了用户与应用程序交互的视觉界面。以一个博客系统为例,文章展示页面就是一个典型的视图。在这个页面上,视图从模型中获取文章的标题、作者、发布时间、正文内容以及评论等数据,然后通过 HTML 和 CSS 的巧妙组合,将这些数据以清晰、美观的格式呈现给用户。标题通常以较大的字体显示在页面的显眼位置,作者和发布时间紧随其后,正文内容则以段落形式有序排列,评论部分也会以列表的形式展示,方便用户查看和参与讨论。这种可视化的呈现方式,不仅提升了用户体验,还使得用户能够轻松地与应用程序进行交互,获取自己感兴趣的信息。 视图就像是一座桥梁,连接着用户和模型中的数据,让数据变得生动、可触。

与模型的关联

视图与模型之间存在着紧密的依赖关系,视图的显示内容完全依赖于模型提供的数据 。可以说,模型是视图的 “数据源”,没有模型的数据支持,视图就如同无源之水,无法呈现出有价值的信息。当模型中的数据发生变化时,视图需要及时更新,以反映最新的数据状态,确保用户看到的始终是最新、最准确的信息。常见的视图更新机制有两种:一种是基于事件驱动的机制,当模型的数据发生变化时,会触发一个事件通知视图,视图接收到事件后,主动从模型中获取最新的数据并进行更新。在一个实时股票交易系统中,当股票价格发生变化时,模型会触发一个 “数据更新” 事件,视图接收到该事件后,立即从模型中获取最新的股票价格数据,并更新页面上的股票价格显示区域,让用户能够及时了解股票价格的波动情况。 另一种是采用观察者模式,视图作为观察者,订阅模型的状态变化。当模型状态改变时,会自动通知所有订阅的视图,视图收到通知后进行相应的更新操作。这种机制在很多现代前端框架中都有广泛应用,比如 Vue.js 和 React 等,它们通过数据绑定和响应式原理,实现了视图与模型的自动同步更新,大大提高了开发效率和用户体验。通过这些机制,视图能够与模型保持紧密的联系,及时响应模型的变化,为用户提供实时、准确的信息展示。

控制器(Controller):交互的协调者

用户输入处理

控制器在 MVC 模式中扮演着至关重要的角色,它就像是一座桥梁,连接着用户与应用程序的核心逻辑。当用户在视图上进行各种操作时,比如点击按钮、提交表单、输入文本等,控制器会第一时间接收这些输入信息 。以电商系统为例,当用户在商品详情页面点击 “加入购物车” 按钮时,这个操作所产生的用户输入信息,如商品 ID、购买数量等,会被视图迅速传递给控制器。控制器就像一个经验丰富的指挥官,会对这些输入信息进行深入解析和细致处理。它会首先验证用户输入的合法性,比如检查商品 ID 是否有效,购买数量是否为正整数等。如果输入不合法,控制器会及时返回错误信息给视图,提示用户进行修正。若输入合法,控制器则会根据这些信息,调用模型中相应的方法,执行添加商品到购物车的业务逻辑 。在这个过程中,控制器准确地将用户的操作意图转化为对模型的具体指令,确保业务流程的顺利进行。

模型与视图的桥梁

控制器不仅仅是用户输入的处理者,更是模型与视图之间交互的协调者 。在完成对用户输入的处理后,控制器会根据业务逻辑的执行结果,调用模型中的方法来获取或更新数据。当用户点击 “加入购物车” 按钮后,控制器会调用模型中的 “添加商品到购物车” 方法,模型会将商品信息添加到购物车数据结构中,并返回操作结果给控制器 。接着,控制器会根据这个结果,选择合适的视图来展示给用户。如果添加商品成功,控制器可能会选择购物车页面视图,将更新后的购物车信息传递给该视图,让用户能够看到购物车中已添加的商品。如果添加商品失败,比如商品库存不足,控制器则会选择错误提示视图,向用户显示相应的错误信息 。通过这种方式,控制器实现了模型与视图之间的高效交互,使得用户能够及时了解操作结果,并且保证了数据的一致性和准确性。它就像一个交通枢纽,确保了信息在模型和视图之间的顺畅流动,让整个应用程序能够有条不紊地运行。

MVC 模式的工作流程深度剖析

用户操作触发

当用户与应用程序进行交互时,操作便在视图层面上展开 。在一个 Web 应用的登录页面,用户在用户名和密码输入框中填入信息,然后点击 “登录” 按钮。这个简单的点击动作,就像是一颗投入平静湖面的石子,在 MVC 模式的体系中激起层层涟漪。 此时,视图作为用户与应用程序交互的直接界面,迅速捕捉到这个操作事件,并将其传递给控制器,开启了整个 MVC 模式的工作流程。这种用户操作的触发,是 MVC 模式运行的起点,也是驱动应用程序响应用户需求的源动力。

控制器响应

控制器在接收到视图传递过来的用户操作事件后,迅速进入工作状态 。它如同一位经验丰富的指挥官,对用户的输入进行深入解析。在电商系统的登录场景中,控制器会提取用户输入的用户名和密码信息,然后调用模型中的 “用户验证” 方法,将这些信息传递给模型进行处理。 这个过程中,控制器起到了承上启下的关键作用,它将用户的操作意图准确无误地传达给模型,确保业务逻辑能够顺利执行。同时,控制器还可以对用户输入进行合法性校验,比如检查用户名是否为空、密码长度是否符合要求等。如果输入不符合要求,控制器会及时返回错误信息给视图,提示用户进行修正,保证了系统的稳定性和可靠性。

模型数据更新

模型收到控制器传来的请求后,开始执行相应的业务逻辑 。在用户登录的场景中,模型会根据用户名和密码,在数据库中进行查询和验证操作。如果用户名和密码匹配成功,模型会返回一个成功的标识给控制器,同时可能会更新用户的登录状态等相关数据。如果验证失败,模型则会返回失败的原因,如 “用户名不存在” 或 “密码错误” 等信息。 在处理商品库存的场景中,当用户下单购买商品时,模型会根据订单信息,更新商品的库存数量,同时记录订单的相关数据,如订单时间、购买数量等。模型就像是一个智能的数据处理器,它不仅能够准确地执行各种业务逻辑,还能及时地将操作结果反馈给控制器,为后续的视图更新提供数据支持。

视图更新展示

控制器在收到模型返回的操作结果后,会根据这个结果选择合适的视图来展示给用户 。如果用户登录成功,控制器可能会选择系统的主页面视图,并将用户的相关信息传递给该视图,如用户名、用户等级等。视图在接收到这些数据后,会进行相应的更新和展示,让用户能够看到登录成功后的系统界面。如果登录失败,控制器则会选择错误提示视图,将模型返回的错误信息传递给该视图,视图会以友好的方式向用户显示错误提示,如弹出一个提示框,告知用户 “用户名或密码错误,请重新输入” 。通过这种方式,视图能够及时地反映模型的变化,为用户提供准确、直观的信息展示,让用户能够清晰地了解自己的操作结果,进一步与应用程序进行交互。

MVC 模式的优势与局限

优势尽显

MVC 模式之所以在软件开发领域备受青睐,是因为它具有众多显著的优势 。首先,关注点分离是 MVC 模式的一大核心优势。通过将应用程序划分为模型、视图和控制器三个部分,每个部分都专注于自己的职责,使得代码的结构更加清晰,易于理解和维护。在一个复杂的电商系统中,模型专注于处理商品数据和业务逻辑,视图负责将商品信息展示给用户,控制器则协调用户操作与模型和视图之间的交互。这样,当需要修改商品的业务逻辑时,只需要在模型层进行修改,而不会影响到视图和控制器,大大降低了代码的维护成本。

其次,可重用性高也是 MVC 模式的重要特点。模型、视图和控制器都可以独立开发和测试,它们之间的耦合度较低,这使得各个部分可以在不同的项目或场景中复用 。例如,一个成熟的用户管理模型,可以在多个不同的应用程序中使用,只需要根据具体需求进行适当的调整。同样,一个通用的视图组件,如表格视图或图表视图,也可以在不同的项目中复用,提高了开发效率和代码质量。

再者,MVC 模式还具有很强的可测试性 。由于模型和控制器都独立于视图,它们可以很容易地进行单元测试。在测试模型时,可以单独测试其业务逻辑和数据处理功能,而不需要依赖于视图的显示。在测试控制器时,可以模拟用户输入,测试其对用户请求的处理和对模型的调用是否正确。这种可测试性有助于提高软件的质量和稳定性,减少潜在的错误和漏洞。

最后,MVC 模式有利于并行开发,提高团队协作效率 。不同的开发人员可以分别负责模型、视图和控制器的开发,他们可以根据自己的专长和技能进行分工,同时进行开发工作。在一个大型项目中,后端开发人员可以专注于模型的开发和业务逻辑的实现,前端开发人员可以负责视图的设计和用户界面的开发,而控制层的开发人员则可以协调两者之间的交互。这种并行开发的方式可以大大缩短项目的开发周期,提高开发效率,同时也便于团队成员之间的沟通和协作。

局限性分析

然而,MVC 模式并非完美无缺,它也存在一些局限性 。首先,MVC 模式的结构相对复杂,对于小型项目来说,采用 MVC 模式可能会增加开发的工作量和复杂度 。在一个简单的网页应用中,使用 MVC 模式可能会导致代码结构过于繁琐,增加了不必要的开发成本和维护难度。因为在小型项目中,业务逻辑相对简单,可能不需要如此复杂的分层结构,直接将数据处理和显示逻辑混合在一起,反而可能更加高效和简洁。

其次,视图与控制器之间的连接较为紧密,这在一定程度上限制了它们的独立重用性 。视图通常需要依赖控制器来获取数据和响应用户操作,而控制器也需要了解视图的具体实现,以便正确地更新视图。在一个 Web 应用中,视图可能需要通过控制器来获取模型中的数据,并根据用户的操作来更新视图的显示。如果要将这个视图重用在另一个项目中,可能需要同时复制相关的控制器代码,这增加了代码的冗余和维护难度。

此外,视图访问模型数据的效率相对较低 。视图通常需要通过控制器来间接访问模型数据,这可能会导致多次数据传递和方法调用,增加了系统的开销。在一些对性能要求较高的应用中,如实时数据监控系统,频繁的视图更新可能会导致性能问题,因为每次视图更新都需要通过控制器从模型中获取数据,这会消耗一定的时间和资源。

最后,MVC 模式并不适合所有类型的项目,特别是那些业务逻辑简单、界面交互较少的小型项目 。在这些项目中,采用 MVC 模式可能会显得过于复杂,反而降低了开发效率和代码的可读性。对于一个简单的个人博客网站,可能只需要一个简单的页面来展示文章内容,使用 MVC 模式可能会增加不必要的开发成本和维护难度,直接使用简单的 HTML 和 CSS 来实现可能更加合适。

MVC 模式在主流框架中的应用实例

Spring MVC 在 Java 开发中的应用

Spring MVC 是 Spring 框架中用于构建 Web 应用的模块,它基于 MVC 设计模式,为 Java Web 开发提供了一种高效、灵活的解决方案 。在实际应用中,Spring MVC 的配置和使用涵盖了多个关键步骤。首先,在项目的配置文件中,需要配置 DispatcherServlet,它是 Spring MVC 的前端控制器,负责接收所有的 HTTP 请求,并将请求分发给相应的控制器进行处理 。在web.xml文件中,可以这样配置 DispatcherServlet:


<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>

上述配置中,<servlet-name>指定了 Servlet 的名称为springmvc,<servlet-class>指定了使用的 Servlet 类为org.springframework.web.servlet.DispatcherServlet,<init-param>中的contextConfigLocation指定了 Spring MVC 的配置文件路径为classpath:springmvc.xml,<load-on-startup>指定了 Servlet 在容器启动时加载 。

接着,需要创建控制器类,用于处理用户请求 。控制器类使用@Controller注解标识,通过@RequestMapping注解来映射请求路径 。下面是一个简单的控制器类示例:

 

@Controller

@RequestMapping("/user")

public class UserController {

@Autowired

private UserService userService;

@RequestMapping("/list")

public String listUsers(Model model) {

List<User> users = userService.getAllUsers();

model.addAttribute("users", users);

return "userList";

}

}

在这个示例中,UserController类被@Controller注解标识为一个控制器类,@RequestMapping("/user")表示该控制器处理的请求路径前缀为/user 。listUsers方法使用@RequestMapping("/list")映射了/user/list请求路径,在方法内部,它调用UserService获取所有用户信息,并将用户列表添加到Model中,最后返回视图名称userList 。

最后,还需要创建视图页面,用于展示数据 。Spring MVC 支持多种视图技术,如 JSP、Thymeleaf 等 。如果使用 JSP 作为视图技术,在WEB-INF/views目录下创建userList.jsp文件,代码如下:


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><html><head><title>用户列表</title></head><body><h1>用户列表</h1><table border="1"><tr><th>ID</th><th>姓名</th><th>邮箱</th></tr><%-- 使用JSTL遍历用户列表 --%><c:forEach items="${users}" var="user"><tr><td>${user.id}</td><td>${user.name}</td><td>${user.email}</td></tr></c:forEach></table></body></html>

在上述 JSP 页面中,使用 JSTL(JavaServer Pages Standard Tag Library)的<c:forEach>标签遍历Model中传递过来的用户列表,并将用户信息展示在表格中 。通过这样的配置和使用,Spring MVC 实现了 MVC 模式,将用户请求处理、业务逻辑和数据展示分离,提高了代码的可维护性和可扩展性 。

Django 在 Python 开发中的应用

Django 是一个基于 Python 的开源 Web 应用框架,它采用了 MVC 模式的变种 MTV(Model - Template - View)模式 。在 Django 中,模型(Model)负责与数据库交互,模板(Template)用于呈现数据,视图(View)负责处理用户请求并将请求路由到正确的模板和模型 。以一个简单的博客应用开发为例,首先创建模型类,在models.py文件中定义博客文章的模型:


from django.db import modelsclass Article(models.Model):title = models.CharField(max_length=200)content = models.TextField()pub_date = models.DateTimeField('date published')

上述代码定义了一个Article模型类,包含title(标题)、content(内容)和pub_date(发布日期)三个字段 。

接着,创建视图函数,在views.py文件中编写处理请求的逻辑:


from django.shortcuts import renderfrom.models import Articledef article_list(request):articles = Article.objects.all()return render(request, 'article_list.html', {'articles': articles})

在这个视图函数中,article_list函数从数据库中获取所有的文章数据,并通过render函数将数据传递给article_list.html模板进行展示 。

然后,创建模板文件,在templates目录下创建article_list.html文件,用于展示文章列表:


<!DOCTYPE html><html><head><title>文章列表</title></head><body><h1>文章列表</h1><ul>{% for article in articles %}<li><h2>{{ article.title }}</h2><p>{{ article.content|truncatewords:50 }}</p><p>发布日期: {{ article.pub_date }}</p></li>{% endfor %}</ul></body></html>

在这个模板文件中,使用 Django 模板语言的{% for %}循环遍历文章列表,展示每篇文章的标题、部分内容和发布日期 。

最后,配置 URL 路由,在urls.py文件中定义 URL 与视图函数的映射关系:


from django.urls import pathfrom. import viewsurlpatterns = [path('articles/', views.article_list, name='article_list'),]

上述配置中,path('articles/', views.article_list, name='article_list')表示当用户访问/articles/路径时,会调用views.article_list视图函数进行处理 。通过这样的方式,Django 利用自身的特性实现了 MVC 模式,使得开发过程更加高效和便捷,同时也提高了代码的可维护性和可扩展性 。

MVC 模式的实践建议与优化策略

合理划分职责

在实际项目中,清晰明确地划分模型、视图和控制器的职责至关重要 。以一个电商系统为例,模型应专注于商品数据的管理和业务逻辑的实现,如商品的库存管理、价格计算等 。视图则负责将商品信息以直观的界面形式展示给用户,如商品列表页面、商品详情页面等 。控制器要承担起处理用户请求、协调模型和视图交互的重任,如处理用户的商品搜索请求、添加商品到购物车的请求等 。为了避免职责混乱,开发团队可以制定详细的开发规范和文档,明确规定每个部分的功能和边界。在团队内部进行代码审查时,重点检查模型、视图和控制器之间的职责划分是否清晰,是否存在功能越界的情况。同时,采用面向对象的设计原则,如单一职责原则,确保每个类只负责一项单一的功能,进一步提高代码的可维护性和可读性。

优化交互流程

优化控制器与模型、视图之间的交互流程,可以显著提高系统的性能和响应速度 。在处理用户请求时,控制器应尽量减少不必要的方法调用和数据传输,提高处理效率。在一个订单管理系统中,当用户提交订单时,控制器可以直接调用模型中高效的订单处理方法,避免在控制器中进行过多的中间计算和处理 。可以采用异步加载和缓存机制来优化视图的更新。在展示商品列表时,视图可以采用异步加载的方式,在后台获取商品数据,避免阻塞页面的加载,提高用户体验 。同时,对于一些常用的数据,可以在视图或控制器中设置缓存,减少对模型的重复请求,提高数据获取的速度 。还可以对控制器与模型、视图之间的通信进行优化,采用高效的消息传递机制,确保信息的及时传递和处理。

结合其他设计模式

MVC 模式与其他设计模式的巧妙结合,可以进一步提升系统设计的灵活性和可维护性 。以工厂模式为例,它可以用于创建模型对象,将对象的创建和使用分离,提高代码的可维护性和可扩展性 。在一个用户管理系统中,使用工厂模式来创建用户模型对象,当需要添加新的用户类型时,只需要在工厂类中添加相应的创建逻辑,而不需要在其他代码中进行大量的修改 。再如,观察者模式可以用于实现模型与视图之间的自动更新,当模型数据发生变化时,自动通知视图进行更新,实现数据与界面的实时同步 。在一个实时数据监控系统中,模型作为被观察者,视图作为观察者,当模型中的数据发生变化时,自动通知相关的视图进行更新,确保用户能够及时获取最新的数据 。通过将 MVC 模式与这些设计模式有机结合,可以充分发挥各自的优势,构建出更加健壮、灵活的软件系统 。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【银河麒麟高级服务器操作系统实际案例分享】数据库资源重启现象分析及处理全过程

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…

C++ Primer 拷贝、赋值与销毁

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

Java面经

Java 知识点总结 1. 封装&#xff0c;继承和多态 封装&#xff1a; “高内聚&#xff0c;低耦合”&#xff0c;隐藏内部实现细节&#xff0c;只通过接口开放部分使用权限给外部。继承&#xff1a; 主要是提高代码复用性&#xff0c;通过子类继承父类&#xff0c;来增加功能扩…

常见的限流算法有哪些?

好的&#xff0c;关于这个问题&#xff0c;我会从几个方面来回答。 首先&#xff0c;限流算法是一种系统保护策略&#xff0c;主要是避免在流量高峰导致系统被压垮&#xff0c;造成系统不可用的问题。 常见的限流算法有 5 种。 1. &#xff08;如图&#xff09;计数器限流&a…

GitHub获取token

获取token clone代码 git clone https://$tokengithub.com/*****/*****.git

公司网络安全组织结构

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 第17章 网络安全应急响应技术原理与应用 17.1 网络安全应急响应概述 居安思危&#xff0c;思则有备&#xff0c;有备无患。网络安全应急响应是针对潜在发生的网络…

《深度学习进阶》第7集:深度实战 通过训练一个智能体玩游戏 来洞察 强化学习(RL)与决策系统

深度学习进阶 | 第7集&#xff1a;深度实战 通过训练一个智能体玩游戏 来洞察 强化学习&#xff08;RL&#xff09;与决策系统 在深度学习的广阔领域中&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种独特的范式&#xff0c;它通过智能体与环境…

【web前端开发】CSS--CSS简介及其编写位置(上)

1、CSS简介 &#xff08;1&#xff09;CSS的全称为&#xff1a;层叠式样式表&#xff08;Cascading Style Sheets&#xff09; &#xff08;2&#xff09;CSS也是一种标记语言&#xff0c;用于给HTML结构设置样式&#xff0c;例如&#xff1a;文字大小、颜色、元素宽度等等…

计算机视觉|Swin Transformer:视觉 Transformer 的新方向

一、引言 在计算机视觉领域的发展历程中&#xff0c;卷积神经网络&#xff08;CNN&#xff09; 长期占据主导地位。从早期的 LeNet 到后来的 AlexNet、VGGNet、ResNet 等&#xff0c;CNN 在图像分类、目标检测、语义分割等任务中取得了显著成果。然而&#xff0c;CNN 在捕捉全…

UE4 组件 (对话组件)

制作一个可以生成对话气泡&#xff0c;显示对话台词的简单组件。这个组件要的变量&#xff1a;台词&#xff08;外部传入&#xff09;。功能&#xff1a;开始对话&#xff08;生成气泡UI&#xff09; &#xff0c;结束对话。 一、对话组件创建 二、开始对话事件 1、注意这里获…

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中

WPF高级 | WPF 应用程序部署与发布&#xff1a;确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…

Vue3自定义hooks

Vue3自定义hooks 什么是自定义hooks 把一个功能的所有数据和方法写到同一个ts文件里。 命名规范&#xff1a;useXxx&#xff0c;小驼峰。 在每一个hooks中&#xff0c;都可以写onMounted、computed等属性&#xff0c;互不干扰。 体现出了组合式AI的优势&#xff0c;一个功能的…

Win7重装不翻车!ISO镜像安全下载渠道+BIOS设置避雷手册

一、写在前面&#xff1a;为什么你需要这份教程&#xff1f; 当电脑频繁蓝屏、系统崩溃甚至无法开机时&#xff0c;重装系统可能是最后的救命稻草。但市面上的教程往往存在三大痛点&#xff1a; ⚠️ 镜像来源不明导致系统被植入后门 ⚠️ 启动盘制作失败反复折腾 ⚠️ 操作失…

DeepSeek大模型 —— 全维度技术解析

DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;点我试试&#xff01;&#xff01; 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1.1…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 一、简单介绍 二、Docker 下载安…

外键 FK enable constraints enq:TM lock

ALTER TABLE X ENABLE NOVALIDATE CONSTRAINT XX&#xff1b; 如果referenced 表在DML 就会出现 enq:TM lock

深度学习语义分割数据集全景解析

一、语义分割任务概述 语义分割是计算机视觉领域的核心任务之一&#xff0c;目标是通过算法将图像中的每个像素精准划分到对应的语义类别&#xff08;如道路、车辆、行人等&#xff09;。高质量标注数据集是推动该领域发展的关键因素。本文将系统梳理主流数据集的技术特征与适…

【芯片设计】处理器芯片大厂前端设计工程师面试记录·20250307

面试问题和ds的参考答案 好的,我现在需要处理用户的请求,他们希望我扩展之前的回答,使其更详细、更丰富。首先,我需要回顾之前的回答,看看哪些部分可以进一步展开。用户提到“回答多说一些!”,这意味着他们希望每个问题的回答内容更深入,包含更多的技术细节、实际案例…

C++特殊类设计

目录 不能被拷贝的类 只能在堆上创建对象的类 构造函数私有化&#xff1a; 析构函数私有化&#xff1a; 只能在栈上创建对象的类 不能被继承的类 只能创建一个对象的类(单例模式) 设计模式&#xff1a; 单例模式&#xff1a; 饿汉模式&#xff1a; 懒汉模式&#xff1a; 线程…

Linux系统之配置HAProxy负载均衡服务器

Linux系统之配置HAProxy负载均衡服务器 前言一、HAProxy介绍1.1 HAProxy简介1.2 主要特点1.3 使用场景二、本次实践介绍2.1 本次实践简介2.2 本次实践环境规划三、部署两台web服务器3.1 运行两个Docker容器3.2 编辑测试文件3.3 访问测试四、安装HAProxy4.1 更新系统软件源4.2 安…