如果您与 Web 开发场景相关,那么您肯定会遇到数百次(甚至更多)首字母缩略词“MVC”。MVC 是当今 Web 编程世界中谈论最多的设计模式之一,这是正确的。在本文中,我们将带您了解 MVC 架构的世界。我们将讨论 MVC 的基础知识,它的优点,最后,一个简单的代码将帮助您以更清晰的方式理解 Java 中的 MVC 实现。
MVC 架构到底是什么?
在我们深入了解它的技术细节之前,让我们先搞清楚一些事情——MVC 不是一种设计模式,它是一种构建应用程序的方式。近年来,Web 应用程序广泛使用 MVC 架构,因此很自然地将其混淆为 Web 应用程序专有的设计模式。但是,让我们告诉您,MVC 最早是在 1979 年被描述的——在 WWW 时代之前,还没有 Web 应用程序的概念。今天用于 Web 应用程序的架构是对原始模式的改编。
事实上,这种架构最初包含在两个主要的 Web 开发框架中——Struts 和 Ruby on Rails。这两种环境为后来出现的大多数 Web 框架铺平了道路——因此这种架构的流行度不断上升。
MVC 架构模式遵循一个基本思想——我们必须在以下基础上分离任何应用程序中的职责:
- 模型:处理数据和业务逻辑。
- 查看: 在需要时向用户展示数据。
- 控制器: 处理用户请求并获取必要的资源。
每个组件都有一组划定的任务,以确保整个应用程序的平稳运行以及完整的模块化。让我们更详细地了解这些组件中的每一个。
控制器
控制器就像应用程序的管家——它执行模型和视图之间的协调来满足用户请求。用户请求以 HTTP get 或 post 请求的形式接收 - 例如,当用户单击任何 GUI 元素以执行任何操作时。
控制器的主要功能是调用模型并与模型协调以获取执行所需的任何必要资源。通常,在接收到用户请求时,控制器会为手头的任务调用适当的模型。
模型
模型很简单,就是我们应用程序的数据。数据以易于存储、检索和编辑的方式“建模” 。该模型是我们如何将规则应用于我们的数据,最终代表我们的应用程序管理的概念。
对于任何软件应用程序,一切都被建模为可以轻松处理的数据。什么是应用程序的用户、书籍或消息?没什么,只有必须根据特定规则处理的数据。例如,日期不得早于当前日期,电子邮件格式必须正确,姓名不得超过“x”个字符等。
每当用户从控制器发出任何请求时,它都会联系适当的模型,该模型返回用户请求的任何数据表示。无论我们希望如何向用户显示,该模型对于特定作品都是相同的。这就是为什么我们可以选择任何可用的视图来渲染模型数据。
此外,模型还包含在模型数据发生任何变化时更新相关控制器的逻辑。
视图
顾名思义,视图负责渲染从模型接收到的数据。可能有预先设计的模板,您可以在其中拟合数据,根据要求,每个模型甚至可能有几个不同的视图。
任何 Web 应用程序的结构都牢记这三个核心组件。可能有一个主控制器负责接收所有请求并调用特定控制器执行特定操作。让我们通过一个示例更好地了解 MVC 架构下 Web 应用程序的工作原理。
让我们看一个例子
让我们以在线文具店为例。用户可以查看商品、购买、将商品添加到购物车、将商品添加到当前订单,甚至添加/删除商品(如果他是管理员)。
现在,让我们看看当用户单击标题“笔”以查看笔列表时会发生什么。
我们的应用程序将有一个特定的控制器来处理与笔相关的所有查询。假设它被称为“pens_controller.php”。我们还将有一个模型来存储我们所拥有的笔的数据——我们称之为“pens_model.php”。最后,我们将有几个视图来呈现数据——一个钢笔列表、一个显示钢笔的表格、一个编辑列表的页面等
。下图显示了从用户单击“开始”的完整控制流程钢笔”,当结果呈现在他面前时:
首先,“pens_controller.php”将用户请求 (1) 处理为 GET 或 POST 请求。我们还可以有一个“index.php”,它是中央控制器,它会在需要时调用“pens_controller”。
然后控制器检查请求和参数并调用所需的模型——在本例中为“pens_model.php”。控制器要求模型返回可用笔列表 (2)。
现在,模型在数据库中搜索必要的信息 (3),必要时应用逻辑,并将数据返回给控制器 (4)。
然后控制器选择适当的视图 (5) 并呈现数据 (6 和 7)。如果请求来自手持设备,则将使用适合它的视图,或者如果用户选择了特定主题,则将选择其视图 - 依此类推。
MVC 架构的优势
如今,应用程序开发人员面临的一个常见问题是对不同类型设备的支持。MVC 架构解决了这个问题,因为开发人员可以为不同的设备创建不同的接口,并根据从哪个设备发出请求,控制器将选择合适的视图。无论使用何种设备,该模型都会发送相同的数据,从而确保所有设备之间的完全一致性。
MVC 分离很好地将视图与业务逻辑隔离开来。它还通过保持代码和工作流程的结构化来降低设计大型应用程序的复杂性。这使得整个代码更易于维护、测试、调试和重用。
使用 Java 实现 MVC 的简单实现
我们将有以下三个:
- StudentObject:模型。
- StudentView:查看课程以在控制台上打印详细信息。
- StudentController:将数据存储在studentObject中并相应更新StudentView的控制器
第 1 步:创建模型
public class Student {
private String rollNo;
private String name;
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
代码是不言自明的。它由获取/设置卷号和学生姓名的功能组成。我们称之为“student.java”。
第 2 步:创建视图
public class StudentView {
public void printStudentDetails(String studentName, String studentRollNo) {
System.out.println("Student: ");
System.out.println("Name: " + studentName);
System.out.println("Roll No: " + studentRollNo);
}
}
这只是将值打印到控制台。我们称之为“studentView.java”。
第三步:创建控制器
public class StudentController {
private Student model;
private StudentView view;
public StudentController(Student model, StudentView view) {
this.model = model;
this.view = view;
}
public void setStudentName(String name) {
model.setName(name);
}
public String getStudentName() {
return model.getName();
}
public void setStudentRollNo(String rollNo) {
model.setRollNo(rollNo);
}
public String getStudentRollNo() {
return model.getRollNo();
}
public void updateView() {
view.printStudentDetails(model.getName(), model.getRollNo());
}
}
将此称为“StudentController.java”。粗略看一眼就会告诉你,这个控制器只是负责调用模型来获取/设置数据,然后更新视图。
现在,让我们看看所有这些是如何联系在一起的。
第 4 步:创建主 Java 文件
public class MVCPatternDemo {
public static void main(String[] args) {
//fetch student record based on his roll no from the database
Student model = retriveStudentFromDatabase();
//Create a view : to write student details on console
StudentView view = new StudentView();
StudentController controller = new StudentController(model, view);
controller.updateView();
//update model data
controller.setStudentName("John");
controller.updateView();
}
private static Student retriveStudentFromDatabase() {
Student student = new Student();
student.setName("Robert");
student.setRollNo("10");
return student;
}
}
这称为“MVCPatternDemo.java”。如您所见,它从数据库或函数中获取学生数据(在本例中,我们使用函数来设置值)并将其推送到 Student 模型。然后,它初始化我们之前创建的视图。
此外,它还初始化我们的控制器并将其绑定到模型和视图。updateView() 方法是控制器的一部分,用于更新控制台上的学生详细信息。
第 5 步:测试结果
如果一切顺利,结果应该是:
Student:
Name: Robert
Roll No: 10
Student:
Name: John
Roll No: 10
如果你得到这个作为输出,恭喜!您已经使用 Java 成功实现了 MVC 架构,尽管是针对一个简单的应用程序。无论多么简单,这个应用程序都足以展示 MVC 架构的强大功能。
总结...
在说了这么多之后,现在很难再强调 MVC 架构在任何 Web/桌面应用程序中的强大功能了。它为您的代码提供了全新级别的模块化,使其更具可读性和可维护性。因此,如果您想在应用程序开发人员的职业生涯中达到新的高度,那么掌握 MVC 架构及其工作应该是您的首要任务。
MVC 如何让工作变得简单?
由于 MVC 具有已定义的结构,因此可以利用它来创建一个非常好的策略来完成开发过程,每个团队成员都处理架构的一个部分,从而使过程不那么复杂。MVC 使开发人员可以轻松地为相同的数据提供不同的视图,这曾经很棘手。与其他架构相比,修改更容易。假设如果业务逻辑发生变化,只有 Model 组件可能会发生变化,其他组件可以保持不变。许多编程语言框架都遵循这种架构,并且可以牢牢掌握 Web 应用程序需要如何构建,因为它为开发板提供了便利。
MVC 的缺点是什么?
与许多技术一样,MVC 也有自己的优点和缺点。通过其更新,MVC 设计模式随着时间的推移获得了新的间接水平。解决方案的复杂性因此变得更加复杂。此外,随着用户界面代码的增长,调试变得更加困难。如果模型继续经常更改,MVC 架构中的视图可能会被更新请求淹没。MVC 设计并不容易学习和理解。由于其复杂的结构和频繁的修订,您可能会发现跟上所有组件和相同的 UI 代码具有挑战性。
MVC架构的范围是什么?
通过使用 MVC 的简单设置,我们可以真正使 Web 开发过程令人兴奋。MVC 使软件开发生命周期的每一步都更容易,更省时。MVC 有着光明的未来。即使编程语言或框架发生变化,架构也将保持不变。您可能会放弃 .NET MVC,转而支持 Python 和遵循 MVC 概念的 Django 框架。您的职业发展更多地取决于您使用的编程语言和框架。尽管如此,作为架构的 MVC 将始终作为您职业发展的可行替代方案。因此,MVC 对您的职业生涯既必要又有益。