第4章

🏗️ 分层架构

掌握分层架构设计模式,包括三层架构、MVC、MVP、MVVM和六边形架构

学习目标

分层架构概述

分层架构(Layered Architecture)是软件架构中最常见和最基础的架构模式之一。它将系统按照功能职责划分为不同的层次,每一层只能与相邻的层进行交互,形成清晰的层次结构。这种架构模式有助于实现关注点分离、提高代码的可维护性和可测试性。

核心理念

分层架构的核心思想是"分而治之",通过将复杂的系统分解为多个相对简单的层次,每个层次专注于特定的职责,从而降低系统的复杂度。

分层架构的优势

分层架构的挑战

三层架构

三层架构(Three-tier Architecture)是最经典的分层架构模式,将应用程序分为表示层、业务逻辑层和数据访问层。这种架构模式在企业级应用开发中被广泛采用。

三层架构示意图
表示层 (Presentation Layer)
业务逻辑层 (Business Logic Layer)
数据访问层 (Data Access Layer)

各层职责详解

表示层 (Presentation Layer)
  • 用户界面展示
  • 用户输入处理
  • 数据格式化和验证
  • 与业务逻辑层交互
业务逻辑层 (Business Logic Layer)
  • 核心业务规则实现
  • 业务流程控制
  • 数据处理和计算
  • 事务管理
数据访问层 (Data Access Layer)
  • 数据库操作封装
  • 数据持久化
  • 数据查询和更新
  • 数据源抽象

实现示例

// 数据访问层
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架构示意图
View
视图
Controller
控制器
Model
模型

MVC组件详解

View (视图)
  • 负责数据的展示
  • 处理用户界面逻辑
  • 接收用户输入
  • 不包含业务逻辑
Controller (控制器)
  • 处理用户请求
  • 协调Model和View
  • 控制应用流程
  • 处理用户交互
Model (模型)
  • 管理应用数据
  • 实现业务逻辑
  • 数据状态管理
  • 通知视图更新
MVC的优势
  • 关注点分离:业务逻辑、数据和界面分离
  • 可维护性:各组件独立,易于维护和修改
  • 可测试性:业务逻辑可以独立测试
  • 并行开发:前端和后端可以并行开发

MVP模式

MVP(Model-View-Presenter)是MVC模式的一个变种,主要区别在于Presenter替代了Controller的角色,并且View和Model之间没有直接的交互,所有的交互都通过Presenter进行。

MVP与MVC的区别

交互方式
MVC:View可以直接访问Model
MVP:View通过Presenter访问Model
耦合度
MVC:View和Model存在耦合
MVP:View和Model完全解耦
可测试性
MVP:更容易进行单元测试
因为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的核心概念

数据绑定
View和ViewModel之间通过数据绑定建立连接,当ViewModel中的数据发生变化时,View会自动更新。
双向绑定
支持双向数据绑定,用户在View中的输入会自动同步到ViewModel,反之亦然。
变更通知
ViewModel实现变更通知机制,当数据发生变化时通知View进行更新。
MVVM的优势
  • 声明式UI:通过数据绑定实现声明式的用户界面
  • 自动同步:数据变化自动反映到界面上
  • 可测试性:ViewModel可以独立于View进行测试
  • 代码简洁:减少了手动更新UI的代码

六边形架构

六边形架构(Hexagonal Architecture),也称为端口和适配器架构(Ports and Adapters),是一种更加灵活的架构模式。它将应用程序的核心业务逻辑与外部系统隔离,通过端口和适配器实现与外部系统的交互。

六边形架构示意图
🔌 适配器 → 🚪 端口 → 🏛️ 核心业务逻辑 → 🚪 端口 → 🔌 适配器
外部系统通过适配器和端口与核心业务逻辑交互

核心概念

端口 (Ports)
定义应用程序与外部世界交互的接口,是业务逻辑对外部依赖的抽象。
适配器 (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 {
    // 邮件服务实现
}

架构选择指南

选择合适的分层架构需要考虑项目的规模、复杂度、团队技能和业务需求等多个因素。以下是一些选择建议:

三层架构
适用场景:
• 传统企业级应用
• 数据驱动的应用
• 团队对分层架构熟悉
• 需要快速开发
MVC/MVP
适用场景:
• Web应用开发
• 用户界面复杂
• 需要良好的可测试性
• 前后端分离项目
MVVM
适用场景:
• 支持数据绑定的平台
• 富客户端应用
• 移动应用开发
• 实时数据更新需求
六边形架构
适用场景:
• 复杂业务逻辑
• 多种外部系统集成
• 高可测试性要求
• 长期维护的系统
选择原则
  • 简单优先:选择能满足需求的最简单架构
  • 团队能力:考虑团队对架构模式的熟悉程度
  • 业务复杂度:复杂业务选择更灵活的架构
  • 技术栈:选择与技术栈匹配的架构模式
  • 演进性:考虑架构的可演进性和扩展性
上一章:质量属性 返回目录 下一章:微服务架构