首先,我们从架构层面大致可以分为:系统架构和应用架构。
所谓的系统架构,也是我们通常所说的网络架构;而应用架构也就是我们所说的代码架构。
以前系统简单,一个应用部署在一台服务器上,且大部分开发工作是CRUD,应用结构简单,且易于维护。随着系统业务复杂度越来越高,功能模块越来越庞大,耦合度也越来越高,导致系统的复杂度越来越不可控。
为了更好的降低应用及模块间的耦合度,于是,诞生了一些我们熟知的网络架构(分布式微服务)和应用架构(三层架构、MVC架构,在此架构上又出现了一些框架,如SSM框架、SSH框架等,使用框架的好处就是结构清晰易于维护)。
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
视图(view):为用户提供使用界面,与用户直接进行交互。
模型(model):代表一个存取数据的对象或 JAVA POJO(Plain Old Java Object,简单java对象)。它也可以带有逻辑,主要用于承载数据,并对用户提交请求进行计算的模块。模型分为两类,一类称为数据承载 Bean,一类称为业务处理Bean。所谓数据承载 Bean 是指实体类(如:User类),专门为用户承载业务数据的;而业务处理 Bean 则是指Service 或 Dao 对象, 专门用于处理用户提交请求的。
注:什么是Bean?官网定义
A Java Bean is a reusable software component that can be manipulated visually in a builder tool.”(一个Java Bean是一个可以在构建工具中可视化操作的可重用软件组件)
控制器(controller):用于将用户请求转发给相应的 Model 进行处理,并根据 Model 的计算结果向用户提供相应响应。它使视图与模型分离。
流程步骤:
1)用户通过View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等;
2)务端 Controller 控制器接收到请求后对请求进行解析,找到相应的Model,对用户请求进行处理Model 处理;
3)将处理结果再交给 Controller(控制器其实只是起到了承上启下的作用);
4)根据处理结果找到要作为向客户端发回的响应View 页面,页面经渲染后发送给客户端。
使用案例:
public class MVCDemo {
public static void main(String[] args) {
UserView view = new UserView();
User model = new User("老张","男");
UserController controller = new UserController(model, view);
//首次读取到数据更新视图
System.out.println("首次加载数据:"+controller.updateView());
//更新模型(后台数据被更新)
controller.setUserName("老王");
//更新后输出到视图
System.out.println("更新后数据:"+controller.updateView());
}
}
/**
*创建模型——数据类User
*/
class User{
private String name;
private String sex;
public User(String name,String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
/**
*创建视图——UserView
*/
class UserView{
public String showView(String name,String sex) {
return "姓名:"+name+",性别:"+sex;
}
}
class UserController{
private User model;
private UserView view;
public UserController(User model,UserView view) {
this.model = model;
this.view = view;
}
public void setUserName(String name){
model.setName(name);
}
public String getUserName(){
return model.getName();
}
public void setUserSex(String name){
model.setSex(name);
}
public String getUserSex(){
return model.getSex();
}
public String updateView(){
System.out.println("更新视图-------");
return view.showView(model.getName(), model.getSex());
}
}
案例效果:
MCV模式最大的优势所在就是,将视图和模型分离,大大提高了代码的可重用性(多个视图可以共享一个模型)。
三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构。
表示层(UI):位于三层构架的最上层,与用户直接接触,表示层就是实现用户的界面功能,也是系统数据的输入与输出,是为用户传达和反馈信息的。
业务逻辑层(BLL):是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理。同时也是表示层与数据层的桥梁,实现三层之间的数据连接和指令传达。
数据访问层(DAL):有时候也称为是持久层,主要功能是对原始数据(数据库或者文本文件等存放数据的形式)的操作(实现数据的增加、删除、修改、查询等)。具体为业务逻辑层或表示层提供数据服务。
在三层架构程序设计中,采用面向接口编程。各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体。
层是一种弱耦合结构,层与层之间的依赖是向下的,上层对下层的调用,是通过接口实现的,而真正提供服务的是下层的接口实现类。服务标准接口是相同的,而实现类是可以替换的,这样就实现了层与层间的解耦。
无论是MVC架构还是三层架构,都是一种规范,都是奔着"高耦合,低内聚"的思想来设计的。
MVC架构主要是为了解决应用程序用户界面的样式替换问题,把视图层尽可能的和业务代码分离。
而三层架构是从整个应用程序架构的角度来分层的。当然,如果有需要的话,还可以分层。在三层架构中业务逻辑层和数据访问层要遵循面向接口编程。