领域模型介绍

领域模型介绍

领域模型(Domain Model)是软件系统中用于抽象和表达业务逻辑的核心结构,它将复杂的业务问题转化为代码中的对象、规则和交互关系,帮助开发者以业务语言构建系统。领域模型的核心目标是高内聚、低耦合,通过清晰的边界(Bounded Context)隔离不同业务模块,确保代码与业务需求高度一致。


领域模型的核心元素及经典案例

我们以电商系统的订单处理流程为例,说明领域模型的核心元素如何协作。

1. 实体(Entity)
  • 定义:具有唯一标识和生命周期的对象,其状态可能随时间变化。
  • 案例Order(订单)
    • 唯一标识:订单号(orderId)是实体的核心标识。
    • 状态变化:订单从“待支付”到“已支付”,再到“已发货”。
    • 业务规则:订单总金额必须大于0,且用户必须存在。
class Order {
    String orderId;
    User user;
    List<OrderItem> items;
    OrderStatus status;
    // 业务方法:计算总金额
    BigDecimal calculateTotal() { ... }
}
2. 值对象(Value Object)
  • 定义:无唯一标识、不可变的对象,通过属性值定义相等性。
  • 案例OrderItem(订单项)
    • 不可变性:订单项一旦创建,商品ID和数量不可修改。
    • 无唯一标识:通过商品ID和数量判断是否相同。
class OrderItem {
    String productId;
    int quantity;
    BigDecimal price;
    // 值对象的相等性由属性决定
    boolean equals(OrderItem other) { ... }
}
3. 聚合根(Aggregate Root)
  • 定义:一组相关对象的访问入口,负责维护业务一致性。
  • 案例Order作为聚合根
    • 一致性边界:修改订单时,必须通过聚合根的方法(如addItem())确保规则。
    • 引用外部对象:通过ID(如userId)引用用户,而非直接持有对象。
class Order {
    // 聚合根的方法负责执行业务规则
    void addItem(Product product, int quantity) {
        if (quantity <= 0) throw new InvalidQuantityException();
        items.add(new OrderItem(product.getId(), quantity, product.getPrice()));
    }
}
4. 领域服务(Domain Service)
  • 定义:处理跨聚合或复杂业务逻辑的无状态服务。
  • 案例OrderService处理订单创建
    • 职责:协调库存检查、订单创建和支付流程。
class OrderService {
    Order createOrder(User user, List<Product> products) {
        // 调用库存服务检查库存
        inventoryService.checkStock(products);
        // 通过工厂创建订单
        Order order = orderFactory.create(user, products);
        // 发布领域事件
        eventPublisher.publish(new OrderCreatedEvent(order));
        return order;
    }
}
5. 仓储(Repository)
  • 定义:封装数据持久化逻辑,提供聚合根的存取接口。
  • 案例OrderRepository
    • 职责:保存和加载订单聚合根,隐藏数据库细节。
interface OrderRepository {
    Order findById(String orderId);
    void save(Order order);
}
6. 领域事件(Domain Event)
  • 定义:表示业务中发生的重要事件,用于触发后续操作。
  • 案例OrderCreatedEvent(订单创建事件)
    • 用途:通知库存系统扣减库存、触发支付流程。
class OrderCreatedEvent {
    String orderId;
    List<Product> products;
    // 事件处理逻辑(由订阅者执行)
    void handle() {
        inventoryService.reduceStock(products);
        paymentService.initiatePayment(orderId);
    }
}
7. 工厂(Factory)
  • 定义:封装复杂对象的创建逻辑。
  • 案例OrderFactory
    • 职责:初始化订单的默认状态(如CREATED)、生成订单号。
class OrderFactory {
    Order create(User user, List<Product> products) {
        Order order = new Order();
        order.setId(generateOrderId());
        order.setStatus(OrderStatus.CREATED);
        products.forEach(p -> order.addItem(p, 1));
        return order;
    }
}

领域模型的价值

通过上述案例可以看到,领域模型:

  1. 统一语言:开发者和业务人员使用相同的术语(如“订单”、“库存”)。
  2. 隔离复杂性:订单逻辑与支付、库存等模块通过事件解耦。
  3. 可维护性:业务规则集中在实体和聚合根中,而非分散在代码各处。

领域模型是 领域驱动设计(DDD) 的核心,适用于业务复杂的系统(如电商、金融),帮助团队在代码中精准表达业务需求。

你可能感兴趣的:(架构)