架构分层设计

0 概述

本文主要在实际工作积累,谈谈个人对架构分层的理解。

1 为什么要分层

  • 如果你的业务非常简单,完全可以不分层,反而分层只会增加工作量
  • 如果业务稍微复查一些,如果不分层将会难以维护,牵一发而动全身,试下想下如果页面上需要展示用户会员等级时候,如果没有分层那么将从头改到尾。
  • 分层的目标是软件易维护、可扩展,让每一层的职责单一(高内聚),每一层只能依赖同层下一层,不乱调用(低耦合)。

2 经典分层架构

最为常见的经典的三层架构:接口层(user interface)、业务逻辑层(business logic)、数据访问层(data access),这种架构比较适合业务规模不是很复杂的场景。
在这里插入图片描述

3 DDD 分层架构

Evans在《领域驱动设计》中提到的分层架构

  • api 层与外部用户/系统交互的,常见的如RPC接口,HTTP接口
  • 应用层 组织整个应用的流程,对领域层域服务进行流程编排完成相应的工作
  • 领域层 系统核心层,负责表达业务概念、规则、状态,完成领域中属于自己应有的行为而不是完成业务,比如人具备吃个能力,是个与业务无关的行为。具体是吃的西瓜还是苹果由上层的Manager 或者Service 来决定(业务来)。
  • 基础设施层,基础设施层围绕领域层、应用层、接口层提供支撑
    在这里插入图片描述
在软件架构设计中,分层结构是一种广泛采用的组织方式,它通过将系统划分为多个逻辑层次,使得每一层专注于特定的功能,并与上下层进行交互。这种设计不仅提升了代码的可维护性和可扩展性,还增强了系统的模块化程度,便于团队协作和功能复用。 ### 分层架构的基本概念 分层架构(Layered Architecture)通常包括以下几个主要层次: - **表示层(Presentation Layer)**:负责与用户交互,接收用户的输入并展示处理结果。例如,Web应用中的前端页面或移动应用的UI组件。 - **业务逻辑层(Business Logic Layer)**:包含核心业务规则和处理逻辑。这一层通常不直接依赖于数据存储细节,而是通过接口与下一层通信。 - **数据访问层(Data Access Layer)**:负责与数据库或其他持久化机制交互,执行数据的读取和写入操作。 每个层次之间通过定义良好的接口进行通信,上层调用下层提供的服务,而下层对上层的具体实现保持透明。这种松耦合的设计有助于提高系统的灵活性和可测试性[^2]。 ### 常用设计模式在分层架构中的应用 在实际开发中,为了更好地实现分层架构的优势,常常会结合一些经典的设计模式来增强系统的结构清晰度和可维护性。以下是几种常用的与分层架构密切相关的模式: #### 1. MVC(Model-View-Controller) MVC 是一种用于构建用户界面的经典模式,尤其适用于 Web 应用程序。它将应用程序分为三个主要部分: - **Model**:管理应用程序的数据和业务逻辑。 - **View**:负责数据的可视化展示。 - **Controller**:处理用户输入,协调 Model 和 View 之间的交互。 MVC 模式通过分离关注点,使得各部分可以独立变化,提高了代码的可维护性和可测试性。在分层架构中,Controller 可以被视为业务逻辑层的一部分,而 Model 则可能跨越业务逻辑层和数据访问层[^1]。 #### 2. DAO(Data Access Object) DAO 模式用于抽象和封装所有对数据源的访问操作。通过定义一个接口,DAO 提供了一组方法供其他层调用,从而屏蔽了底层数据访问的具体实现。这种方式使得上层无需关心数据是如何存储或检索的,只需通过统一的接口进行操作。DAO 模式常用于数据访问层,帮助实现业务逻辑与数据存储的解耦[^1]。 #### 3. Service Layer(服务层) 服务层是位于业务逻辑层和表示层之间的一个抽象层,它封装了应用程序的核心业务逻辑。服务层通常由一组无状态的服务组成,这些服务可以通过远程调用(如 REST API 或 SOAP)被外部系统访问。服务层的存在使得业务逻辑更加集中和易于管理,同时也为不同客户端提供了统一的接口[^1]。 #### 4. Repository 模式 Repository 模式是对 DAO 模式的进一步抽象,它提供了一个更高级别的数据访问接口,隐藏了底层数据访问的复杂性。Repository 不仅可以处理数据的查询和更新,还可以支持事务管理和批量操作。该模式常见于领域驱动设计(DDD),并在业务逻辑层中扮演重要角色,确保业务规则的一致性和完整性[^1]。 #### 5. Dependency Injection(依赖注入) 虽然依赖注入不是专门针对分层架构的模式,但它在实现松耦合的分层结构中起到了关键作用。通过依赖注入,对象不再自己创建或查找其依赖项,而是由外部容器自动注入所需的依赖。这不仅简化了代码的编写,还极大地提升了代码的可测试性和可维护性。Spring Framework 中广泛使用了依赖注入机制来管理各个层次之间的依赖关系[^1]。 ### 示例:基于 Spring Boot 的分层架构实现 下面是一个简单的 Spring Boot 应用程序示例,展示了如何使用上述提到的设计模式来构建一个典型的分层架构: ```java // Model 类 public class User { private Long id; private String name; private String email; // Getters and Setters } // Repository 接口 public interface UserRepository extends JpaRepository<User, Long> { } // Service 层 @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getAllUsers() { return userRepository.findAll(); } public User getUserById(Long id) { return userRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("User not found")); } public User createUser(User user) { return userRepository.save(user); } } // Controller 层 @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping public List<User> getAllUsers() { return userService.getAllUsers(); } @GetMapping("/{id}") public User getUser(@PathVariable Long id) { return userService.getUserById(id); } @PostMapping public User createUser(@RequestBody User user) { return userService.createUser(user); } } ``` 在这个例子中,`User` 类代表模型层,`UserRepository` 是 DAO 接口,`UserService` 实现了服务层的逻辑,而 `UserController` 处理 HTTP 请求并返回响应。整个架构清晰地划分了职责,并通过 Spring 的依赖注入机制实现了各层之间的解耦。 ### 总结 分层架构作为一种经典的软件设计方法,能够有效提升系统的可维护性、可扩展性和可测试性。通过结合 MVC、DAO、Service Layer、Repository 模式以及依赖注入等设计模式,开发者可以在实践中更好地组织代码结构,降低模块间的耦合度,从而构建出更加健壮和灵活的应用系统。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值