设计模式

设计模式

到2025年1月12号,终于明白宋红康说的这句话的含义:框架 = 注解 + 反射 + 设计模式

MVC 和三层架构

三层架构是一种软件设计模式,但又不同于传统意义上的设计模式,我们可以将其称之为设计架构,而MVC是设计模式的一种

三层架构分为:

  • 表示层(Presentation Layer)

  • 业务逻辑层(Business Logic Layer, BLL)

  • 数据访问层(Data Access Layer, DAL)

这种架构使用了多个设计模式,具体取决于实现方式,但常见的设计模式包括但不限于:

  • MVC模式(Model-View-Controller):在表示层中常见的一种模式,用于分离用户界面逻辑(View)、业务逻辑(Model)和输入控制(Controller)。
  • 工厂模式(Factory Pattern):用于创建对象而无需指定具体的类,常用于业务逻辑层中创建复杂对象。
  • 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点,经常用于配置管理或连接池等资源。
  • 仓库模式(Repository Pattern):用于抽象数据访问层,使得业务逻辑层可以独立于数据源的具体实现。
  • 服务定位器模式(Service Locator Pattern):帮助查找和缓存服务对象,有助于减少依赖关系。
  • 单元OfWork模式(Unit of Work Pattern):保持一系列要作为一个整体提交或回滚的操作,通常在数据访问层中使用。

后端

在一个spring框架的后端项目中,可以使用三层架构来实现设计模式

  • 表示层:在前后的分离的项目中,在web API的设计中是Controller层,但也可以理解为这一层单独独立出一个前端工程

  • 业务逻辑层:包含服务(Service)组件,负责业务逻辑

  • 数据访问层:由仓库(Repository)或DAO(Data Access Object)组成,负责与数据库交互

在组合mybatis框架之后,后端的数据访问层由mybatis的mapper层接管

但以MVC设计模式来理解后端,则为:

  • Model(模型)

    • 数据载体:模型代表应用程序的数据和业务逻辑。它不仅包括实体类(如POJOs),还可能包括DTO(数据传输对象)、VO(值对象)等。

    • 服务层:虽然严格来说,服务层不是MVC的一部分,但它与模型紧密相关,因为它是处理业务逻辑的地方。服务组件通常会操作模型,并且可以被控制器调用来执行特定的业务功能。

  • View(视图)

    • 视图解析器:在传统的Spring MVC应用中,视图通常是HTML页面、JSP文件、Thymeleaf模板等,用于展示给用户的数据。Spring使用视图解析器(ViewResolver)来确定哪个视图应该被渲染。

    • 前后端分离:在现代的前后端分离架构中,视图的概念有所变化。前端不再由后端直接生成,而是通过API接口接收JSON或XML格式的数据,然后由前端框架(如Vue.js、React等)负责渲染。此时,“视图”更倾向于指向前端如何解释和显示这些数据。

  • Controller(控制器)

    • @Controller/@RestController注解:控制器是MVC模式中最重要的部分之一,在Spring中通常通过@Controller@RestController注解来标识。它们负责接收HTTP请求,处理请求参数,调用相应的服务方法,以及返回视图名称或直接返回数据(如JSON、XML)给客户端。

    • RequestMapping:控制器中的方法通常使用@RequestMapping及其衍生注解(如@GetMapping@PostMapping等)来映射具体的URL路径到方法上,从而实现对不同HTTP请求的处理。


前端

Vue前端工程,也是可以看作使用mvc设计模式的,但也可以看作使用MVVM设计模式

  • HTML + CSS:用于构建用户界面(View)。这是用户直接交互的部分
  • JavaScript/TypeScript:用来实现视图模型(ViewModel,在MVVM模式下)或控制器(Controller,在MVC模式下)

在前端,模型的概念可能不像在后端那样明确,尤其是在使用纯JavaScript时。然而,当你引入TypeScript时,你可以更加严格地定义接口和类型,这有助于更好地贯彻模型概念。例如,你可以创建TypeScript接口来定义从后端接收的数据结构,或者定义状态管理库(如Vuex)中的状态结构,这实际上是在前端实现了模型的概念。