🏗️ 分层架构
掌握分层架构设计模式,包括三层架构、MVC、MVP、MVVM和六边形架构
学习目标
- 理解分层架构的基本概念和设计原则
- 掌握三层架构的设计和实现方法
- 学习MVC、MVP、MVVM等经典架构模式
- 了解六边形架构的设计思想和应用场景
- 能够根据项目需求选择合适的分层架构
分层架构概述
分层架构(Layered Architecture)是软件架构中最常见和最基础的架构模式之一。它将系统按照功能职责划分为不同的层次,每一层只能与相邻的层进行交互,形成清晰的层次结构。这种架构模式有助于实现关注点分离、提高代码的可维护性和可测试性。
分层架构的核心思想是"分而治之",通过将复杂的系统分解为多个相对简单的层次,每个层次专注于特定的职责,从而降低系统的复杂度。
分层架构的优势
- 关注点分离:每一层专注于特定的业务逻辑,职责清晰
- 可维护性:修改某一层的实现不会影响其他层
- 可测试性:每一层可以独立进行单元测试
- 可重用性:底层组件可以被多个上层组件复用
- 团队协作:不同团队可以并行开发不同的层次
分层架构的挑战
- 性能开销:层次间的调用可能带来性能损耗
- 过度设计:简单系统可能不需要复杂的分层
- 层次耦合:不当的设计可能导致层次间紧耦合
- 数据传递:数据在层次间传递可能产生冗余
三层架构
三层架构(Three-tier Architecture)是最经典的分层架构模式,将应用程序分为表示层、业务逻辑层和数据访问层。这种架构模式在企业级应用开发中被广泛采用。
各层职责详解
- 用户界面展示
- 用户输入处理
- 数据格式化和验证
- 与业务逻辑层交互
- 核心业务规则实现
- 业务流程控制
- 数据处理和计算
- 事务管理
- 数据库操作封装
- 数据持久化
- 数据查询和更新
- 数据源抽象
实现示例
// 数据访问层
public interface UserRepository {
User findById(Long id);
void save(User user);
List<User> findAll();
}
// 业务逻辑层
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserById(Long id) {
return userRepository.findById(id);
}
public void createUser(User user) {
// 业务规则验证
validateUser(user);
userRepository.save(user);
}
}
// 表示层
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.getUserById(id);
return ResponseEntity.ok(user);
}
}
MVC模式
MVC(Model-View-Controller)是一种经典的架构模式,将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式特别适用于用户界面的设计。
视图
控制器
模型
MVC组件详解
- 负责数据的展示
- 处理用户界面逻辑
- 接收用户输入
- 不包含业务逻辑
- 处理用户请求
- 协调Model和View
- 控制应用流程
- 处理用户交互
- 管理应用数据
- 实现业务逻辑
- 数据状态管理
- 通知视图更新
- 关注点分离:业务逻辑、数据和界面分离
- 可维护性:各组件独立,易于维护和修改
- 可测试性:业务逻辑可以独立测试
- 并行开发:前端和后端可以并行开发
MVP模式
MVP(Model-View-Presenter)是MVC模式的一个变种,主要区别在于Presenter替代了Controller的角色,并且View和Model之间没有直接的交互,所有的交互都通过Presenter进行。
MVP与MVC的区别
MVP:View通过Presenter访问Model
MVP:View和Model完全解耦
因为View接口可以被模拟
MVP实现示例
// View接口
public interface UserView {
void showUser(User user);
void showError(String message);
void showLoading();
void hideLoading();
}
// Presenter
public class UserPresenter {
private UserView view;
private UserService userService;
public UserPresenter(UserView view, UserService userService) {
this.view = view;
this.userService = userService;
}
public void loadUser(Long userId) {
view.showLoading();
try {
User user = userService.getUserById(userId);
view.showUser(user);
} catch (Exception e) {
view.showError(e.getMessage());
} finally {
view.hideLoading();
}
}
}
MVVM模式
MVVM(Model-View-ViewModel)是另一种架构模式,特别适用于支持数据绑定的平台。ViewModel作为View和Model之间的桥梁,通过数据绑定机制实现View的自动更新。
MVVM的核心概念
- 声明式UI:通过数据绑定实现声明式的用户界面
- 自动同步:数据变化自动反映到界面上
- 可测试性:ViewModel可以独立于View进行测试
- 代码简洁:减少了手动更新UI的代码
六边形架构
六边形架构(Hexagonal Architecture),也称为端口和适配器架构(Ports and Adapters),是一种更加灵活的架构模式。它将应用程序的核心业务逻辑与外部系统隔离,通过端口和适配器实现与外部系统的交互。
核心概念
六边形架构的优势
- 技术无关性:核心业务逻辑不依赖具体技术
- 易于测试:可以轻松模拟外部依赖
- 灵活性:可以轻松替换外部系统
- 可维护性:业务逻辑与技术实现分离
// 端口定义
public interface UserRepository {
User findById(Long id);
void save(User user);
}
public interface NotificationService {
void sendEmail(String to, String subject, String content);
}
// 核心业务逻辑
public class UserService {
private final UserRepository userRepository;
private final NotificationService notificationService;
public UserService(UserRepository userRepository,
NotificationService notificationService) {
this.userRepository = userRepository;
this.notificationService = notificationService;
}
public void registerUser(User user) {
// 纯业务逻辑
validateUser(user);
userRepository.save(user);
notificationService.sendEmail(user.getEmail(),
"Welcome", "Welcome to our platform!");
}
}
// 适配器实现
@Repository
public class JpaUserRepository implements UserRepository {
// JPA实现
}
@Service
public class EmailNotificationService implements NotificationService {
// 邮件服务实现
}
架构选择指南
选择合适的分层架构需要考虑项目的规模、复杂度、团队技能和业务需求等多个因素。以下是一些选择建议:
• 传统企业级应用
• 数据驱动的应用
• 团队对分层架构熟悉
• 需要快速开发
• Web应用开发
• 用户界面复杂
• 需要良好的可测试性
• 前后端分离项目
• 支持数据绑定的平台
• 富客户端应用
• 移动应用开发
• 实时数据更新需求
• 复杂业务逻辑
• 多种外部系统集成
• 高可测试性要求
• 长期维护的系统
- 简单优先:选择能满足需求的最简单架构
- 团队能力:考虑团队对架构模式的熟悉程度
- 业务复杂度:复杂业务选择更灵活的架构
- 技术栈:选择与技术栈匹配的架构模式
- 演进性:考虑架构的可演进性和扩展性