Паттерн CQRS
Command-Query Separation - принцип разделения команд и запросов, предложил Бертран Мейер. разделяй и властвуй - принцип который применил Юлий Цезарь при завоевании Галлии, А теперь и мы изучим.
// Базовый интерфейс событий
public interface Event {}
// Событие создания заказа
public class OrderCreatedEvent implements Event {
private final String orderId;
private final String product;
public OrderCreatedEvent(String orderId, String product) {
this.orderId = orderId;
this.product = product;
}
public String getOrderId() { return orderId; }
public String getProduct() { return product; }
} public class CreateOrderCommand {
private final String orderId;
private final String product;
public CreateOrderCommand(String orderId, String product) {
this.orderId = orderId;
this.product = product;
}
public String getOrderId() { return orderId; }
public String getProduct() { return product; }
} public class EventStore {
private final List<Event> events = new ArrayList<>();
public void save(Event event) {
events.add(event);
}
public List<Event> getEvents() {
return new ArrayList<>(events);
}
} public class OrderCommandHandler {
private final EventStore eventStore;
public OrderCommandHandler(EventStore eventStore) {
this.eventStore = eventStore;
}
public void handle(CreateOrderCommand command) {
// Логика проверки, бизнес-валидации и т.д.
OrderCreatedEvent event = new OrderCreatedEvent(command.getOrderId(), command.getProduct());
eventStore.save(event);
System.out.println("OrderCreatedEvent сохранено: " + command.getOrderId());
}
} public class OrderReadModel {
private final Map<String, String> orders = new HashMap<>();
public void apply(Event event) {
if (event instanceof OrderCreatedEvent e) {
orders.put(e.getOrderId(), e.getProduct());
}
}
public String getProduct(String orderId) {
return orders.get(orderId);
}
} public class EventProcessor {
private final OrderReadModel readModel;
public EventProcessor(OrderReadModel readModel) {
this.readModel = readModel;
}
public void process(List<Event> events) {
for (Event event : events) {
readModel.apply(event);
}
}
} EventStore eventStore = new EventStore();
OrderReadModel readModel = new OrderReadModel();
OrderCommandHandler commandHandler = new OrderCommandHandler(eventStore);
EventProcessor processor = new EventProcessor(readModel);
// Создаём заказы
commandHandler.handle(new CreateOrderCommand("1", "Laptop"));
commandHandler.handle(new CreateOrderCommand("2", "Smartphone"));
// Обновляем проекцию для чтения
processor.process(eventStore.getEvents());
// Чтение данных
System.out.println(readModel.getProduct("1")); // Laptop
System.out.println(readModel.getProduct("2")); // Smartphone