DDD - 整洁架构

news/2025/2/24 23:55:05

DDD(领域驱动设计)的整洁架构(Clean Architecture)是一种通过分层和依赖规则,确保领域模型(业务逻辑)与技术实现解耦的架构模式。其核心目标是让业务逻辑成为系统的核心,而技术细节(如数据库、框架、UI)成为可替换的“插件”。

整洁结构如何帮助团队专注于领域模型,减少外部变化的影响,提升软件质量。

一、核心原则

  1. 分层架构
    代码按职责分为多层(如接口层、应用层、领域层、基础设施层),确保各层职责明确。

  2. 依赖规则
    外层依赖内层,内层不感知外层。例如:领域层不依赖基础设施层,但基础设施层可以实现领域层定义的接口。

  3. 领域模型为核心
    领域层(Domain Layer)是核心,包含业务实体、规则和领域服务,与技术无关。

  4. 技术细节可替换
    数据库、框架等实现细节放在外层(如基础设施层),可随时替换而不影响业务逻辑。

二、整洁架构示意图

三、举例说明-电商订单系统

1. 接口层(Interface Layer)
  • 职责:处理外部输入(如 HTTP 请求、消息队列事件),将输入转换为领域层可理解的格式。

  • 示例

// OrderController.java(接口层)
@RestController
public class OrderController {
    private final OrderService orderService;

    // 依赖注入应用层服务
    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @PostMapping("/orders")
    public ResponseEntity<OrderDTO> createOrder(@RequestBody CreateOrderRequest request) {
        // 将 HTTP 请求转换为应用层命令
        CreateOrderCommand command = new CreateOrderCommand(request.getUserId(), request.getItems());
        Order order = orderService.createOrder(command);
        return ResponseEntity.ok(OrderDTO.fromDomain(order));
    }
}
2. 应用层(Application Layer)
  • 职责:协调领域对象和基础设施,实现用例流程,不包含业务规则。

  • 示例

// OrderService.java(应用层)
public class OrderService {
    private final OrderRepository orderRepository;
    private final PaymentGateway paymentGateway;

    // 依赖基础设施接口(如 OrderRepository)
    public OrderService(OrderRepository orderRepository, PaymentGateway paymentGateway) {
        this.orderRepository = orderRepository;
        this.paymentGateway = paymentGateway;
    }

    public Order createOrder(CreateOrderCommand command) {
        // 调用领域层逻辑
        Order order = Order.create(command.getUserId(), command.getItems());
        
        // 协调支付等外部服务
        paymentGateway.processPayment(order.getTotalAmount());
        
        // 调用基础设施层保存订单
        orderRepository.save(order);
        return order;
    }
}
3. 领域层(Domain Layer)
  • 职责:定义业务实体、值对象、领域服务,包含核心业务规则。

  • 示例

// Order.java(领域层)
public class Order {
    private OrderId id;
    private UserId userId;
    private List<OrderItem> items;
    private OrderStatus status;

    // 领域方法:创建订单的业务规则
    public static Order create(UserId userId, List<OrderItem> items) {
        if (items.isEmpty()) {
            throw new IllegalArgumentException("订单必须包含商品");
        }
        Order order = new Order();
        order.id = OrderId.generate();
        order.userId = userId;
        order.items = items;
        order.status = OrderStatus.CREATED;
        return order;
    }

    // 领域方法:订单状态流转规则
    public void markAsPaid() {
        if (this.status != OrderStatus.CREATED) {
            throw new IllegalStateException("只有已创建的订单可标记为已支付");
        }
        this.status = OrderStatus.PAID;
    }
}
4. 基础设施层(Infrastructure Layer)
  • 职责:实现技术细节(如数据库操作、第三方服务调用),依赖领域层接口。

  • 示例

// JpaOrderRepository.java(基础设施层)
public class JpaOrderRepository implements OrderRepository {
    private final OrderJpaRepository jpaRepository;

    // 实现领域层定义的 OrderRepository 接口
    @Override
    public void save(Order order) {
        OrderEntity entity = OrderEntity.fromDomain(order);
        jpaRepository.save(entity);
    }
}

// PaymentGatewayImpl.java(基础设施层)
public class PaymentGatewayImpl implements PaymentGateway {
    @Override
    public void processPayment(BigDecimal amount) {
        // 调用第三方支付 API
        ThirdPartyPaymentClient.process(amount);
    }
}

四、关键优势

  1. 业务逻辑与技术解耦
    领域层不依赖具体数据库或框架,可独立测试和演进。例如,更换数据库只需修改基础设施层。

  2. 可维护性
    新增功能时,只需关注领域层的业务规则,无需修改技术实现。

  3. 清晰的依赖方向
    依赖始终向内指向领域层,避免循环依赖。

DDD 的整洁结构通过分层和依赖倒置,让业务逻辑成为系统的核心,技术实现成为可插拔的细节。这种设计尤其适合复杂业务系统,能够显著提升代码的可维护性和扩展性。


http://www.niftyadmin.cn/n/5864863.html

相关文章

PH热榜 | 2025-02-23

1. NYX 标语&#xff1a;你智能化的营销助手&#xff0c;助你提升业绩。 介绍&#xff1a;NYX的人工智能助手简化了从头到尾的广告活动管理&#xff0c;帮助你轻松创建高转化率的广告&#xff0c;启动多渠道营销活动&#xff0c;并通过实时分析来优化表现。它还可以整合主要的…

【网络编程】广播和组播

数据包发送方式只有一个接受方&#xff0c;称为单播。如果同时发给局域网中的所有主机&#xff0c;称为广播。只有用户数据报(使用UDP协议)套接字才能广播&#xff1a; 广播地址以192.168.1.0 (255.255.255.0) 网段为例&#xff0c;最大的主机地址192.168.1.255代表该网段的广…

设计模式| 观察者模式 Observer Pattern详解

目录 一、概述1.1 动机1.2 核心思想1.3 别名 二、角色与实现原理2.1 角色2.2 实现原理2.3 类图 三、经典接口实现3.1 示例3.1.1 观察者接口3.1.2 目标接口3.1.3 具体被观察者3.1.4 具体观察者3.1.5 Client3.1.6 UML时序图 3.2 特点 四、其他实现方式4.1 委托与事件&#xff08;…

前端设计模式面试题及参考答案

目录 如何用闭包实现单例模式?列举两种实现方式 工厂模式与构造函数创建对象的核心区别是什么? 抽象工厂模式如何解决多平台 UI 组件兼容问题? 原型模式在前端框架中如何优化对象创建性能? 建造者模式如何实现复杂表单配置的链式调用? 单例模式在全局状态管理中的典型…

QT串口通信之二,实现单个温湿度传感器数据的采集(采用Qt-modbus实现)

接上 QT串口通信之一,实现单个温湿度传感器数据的采集 上述文章中用QSerialPort实现了温湿度传感器的采集,实际上比较麻烦的,因为需要自定义解析帧, 接下来,用Qt-modbus-封装度更高的协议,来实现温湿度的采集; #include "MainWindow.h" #include "ui_M…

Spring Boot嵌入式服务器深度解析:从配置到调优的全方位指南

文章目录 引言一、嵌入式服务器核心原理1.1 架构设计特点1.2 主流服务器对比 二、嵌入式服务器配置实战2.1 基础配置模板2.2 HTTPS安全配置 三、高级调优策略3.1 线程池优化&#xff08;Tomcat示例&#xff09;3.2 响应压缩配置3.3 访问日志配置 四、服务器切换实战4.1 切换至U…

Pinia 3.0 正式发布:全面拥抱 Vue 3 生态,升级指南与实战教程

一、重大版本更新解析 2024年2月11日&#xff0c;Vue 官方推荐的状态管理库 Pinia 迎来 3.0 正式版发布&#xff0c;本次更新标志着其全面转向 Vue 3 技术生态。以下是开发者需要重点关注的升级要点&#xff1a; 1.1 核心变更说明 特性3.0 版本要求兼容性说明Vue 支持Vue 3.…

鸿蒙5.0实战案例:基于measure实现的文本测量

往期推文全新看点&#xff08;文中附带全新鸿蒙5.0全栈学习笔录&#xff09; ✏️ 鸿蒙&#xff08;HarmonyOS&#xff09;北向开发知识点记录~ ✏️ 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…