你是否曾为复杂的业务逻辑感到头疼?是否在面对需求变更时感到无力?今天,我们将带你深入**领域驱动设计(DDD)**的世界,通过一个简单的电商订单系统实战项目,快速掌握DDD的核心思想与实现方法!
无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供清晰的指导和实用的代码示例。读完本文,你将能够:
**领域驱动设计(Domain-Driven Design,DDD)**是一种以业务领域为核心的软件设计方法论。它强调通过深入理解业务需求,构建出高内聚、低耦合的领域模型,从而应对复杂的业务逻辑。
DDD通常采用分层架构,将系统划分为以下四层:
我们将通过一个简单的电商订单系统Demo,演示如何用Java实现DDD架构。
src
├── main
│ ├── java
│ │ ├── com.example.order
│ │ │ ├── application
│ │ │ │ └── OrderService.java
│ │ │ ├── domain
│ │ │ │ ├── model
│ │ │ │ │ ├── Order.java
│ │ │ │ │ ├── OrderItem.java
│ │ │ │ │ └── OrderStatus.java
│ │ │ │ ├── service
│ │ │ │ │ └── OrderDomainService.java
│ │ │ │ └── repository
│ │ │ │ └── OrderRepository.java
│ │ │ └── infrastructure
│ │ │ └── InMemoryOrderRepository.java
│ └── resources
└── test
└── java
└── com.example.order
└── application
└── OrderServiceTest.java
Order
和 OrderItem
package com.example.order.domain.model;
import java.util.List;
public class Order {
private String orderId;
private String customerId;
private List<OrderItem> items;
private OrderStatus status;
public Order(String orderId, String customerId, List<OrderItem> items) {
this.orderId = orderId;
this.customerId = customerId;
this.items = items;
this.status = OrderStatus.CREATED;
}
public void markAsPaid() {
this.status = OrderStatus.PAID;
}
public String getOrderId() {
return orderId;
}
public String getCustomerId() {
return customerId;
}
public List<OrderItem> getItems() {
return items;
}
public OrderStatus getStatus() {
return status;
}
}
class OrderItem {
private String productId;
private int quantity;
private double price;
public OrderItem(String productId, int quantity, double price) {
this.productId = productId;
this.quantity = quantity;
this.price = price;
}
public String getProductId() {
return productId;
}
public int getQuantity() {
return quantity;
}
public double getPrice() {
return price;
}
}
enum OrderStatus {
CREATED, PAID, SHIPPED, CANCELLED
}
OrderDomainService
package com.example.order.domain.service;
import com.example.order.domain.model.Order;
public class OrderDomainService {
public void payOrder(Order order) {
if (order.getStatus() == OrderStatus.CREATED) {
order.markAsPaid();
} else {
throw new IllegalStateException("Order cannot be paid in its current state.");
}
}
}
OrderRepository
package com.example.order.domain.repository;
import com.example.order.domain.model.Order;
public interface OrderRepository {
void save(Order order);
Order findById(String orderId);
}
InMemoryOrderRepository
package com.example.order.infrastructure;
import com.example.order.domain.model.Order;
import com.example.order.domain.repository.OrderRepository;
import java.util.HashMap;
import java.util.Map;
public class InMemoryOrderRepository implements OrderRepository {
private final Map<String, Order> orders = new HashMap<>();
@Override
public void save(Order order) {
orders.put(order.getOrderId(), order);
}
@Override
public Order findById(String orderId) {
return orders.get(orderId);
}
}
OrderService
package com.example.order.application;
import com.example.order.domain.model.Order;
import com.example.order.domain.repository.OrderRepository;
import com.example.order.domain.service.OrderDomainService;
import java.util.List;
public class OrderService {
private final OrderRepository orderRepository;
private final OrderDomainService orderDomainService;
public OrderService(OrderRepository orderRepository, OrderDomainService orderDomainService) {
this.orderRepository = orderRepository;
this.orderDomainService = orderDomainService;
}
public void createOrder(String orderId, String customerId, List<OrderItem> items) {
Order order = new Order(orderId, customerId, items);
orderRepository.save(order);
}
public void payOrder(String orderId) {
Order order = orderRepository.findById(orderId);
orderDomainService.payOrder(order);
orderRepository.save(order);
}
}
OrderServiceTest
package com.example.order.application;
import com.example.order.domain.model.OrderItem;
import com.example.order.domain.model.OrderStatus;
import com.example.order.domain.repository.OrderRepository;
import com.example.order.domain.service.OrderDomainService;
import com.example.order.infrastructure.InMemoryOrderRepository;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
class OrderServiceTest {
@Test
void testCreateAndPayOrder() {
OrderRepository repository = new InMemoryOrderRepository();
OrderDomainService domainService = new OrderDomainService();
OrderService orderService = new OrderService(repository, domainService);
// 创建订单
orderService.createOrder("order1", "customer1", List.of(new OrderItem("product1", 2, 100.0)));
// 支付订单
orderService.payOrder("order1");
// 验证订单状态
Order order = repository.findById("order1");
assertEquals(OrderStatus.PAID, order.getStatus());
}
}
通过这个简单的电商订单系统Demo,我们演示了如何使用DDD架构设计和实现一个Java项目。DDD的核心思想是将业务逻辑放在首位,通过清晰的领域模型和分层架构,构建出高内聚、低耦合的系统。
如果你对DDD感兴趣,推荐阅读以下书籍:
你在实际项目中是否使用过DDD?遇到了哪些挑战?欢迎在评论区分享你的经验和心得!
如果觉得这篇文章对你有帮助,别忘了点赞、转发哦!关注我,获取更多技术干货!