MVC架构
发表日期:2020.5.12
赵路仓
摘要:MVC架构将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
引 言
MVC架构是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。用一种逻辑、数据、界面相分离的思想组织代码。具有耦合性低,重用性高,部署快等等优点。
模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控制器三者之间的关系和各自的主要功能
1) 最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。
2) 最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。
3) 中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。
图1:MVC架构图例
- Model层
模型层简单理解就是数据用于提供数据。就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果,业务模型的设计可以说是MVC最主要的核心。
而在项目中对数据库的基本访问可以视为一个不可分割的最底层操作,换言之对数据库数据的增删改查可以放在Model层。在代码中我们会写DAO和DTO类型的代码,这个DAO和DTO可以理解为是Model层的代码。
1.View层
View层也叫做视图层,对于一个Web应用来说,可以概括为HTML页面,也可能是XHTML或XML、JSP等等一些可以用于界面展示的代码。随着应用的复杂性和规模性,界面的处理也变得更具有挑战性,一个应用也可能有不同的视图,业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。
2.Controller层
Controller可以理解为从用户接受请求,将Model层和View层匹配在一起,共同完成用户的请求,他的作用也很明显,很直白的告诉你他就是一个分发器,选择什么样的视图,或者说完成什么样的请求,控制层并不做任何的数据处理。例如:一个用户点击一个按钮,控制层接受请求后,不处理业务信息,只把用户提供的信息转发给模型层,告诉模型需要做什么,并选择合适的视图返回给用户,因此一个模型可能对应多个视图,一个视图可能对应多个模型。
3.MVC架构特点
耦合性低:视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
重用性高:随着技术的不断进步,需要用越来越多的方式来访问应用程序。MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器。
4.案例
用Student(学生)为例来演示MVC模式的用法:
图2:Student类图
View层:StudentView这里用控制台来简单代替HTML页面。
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); } }
Model层:Student用以替代对数据库的访问操作
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; } }
Contorller层:将Model层和View层连接
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()); } }