Design Patterns Master 7
Modernes Enterprise-Maven-Lernpaket. Markdown wird immer auch als HTML geliefert.
Design Patterns in Master 7
Fachliche Muster
• Aggregate Root: Order, Invoice, Payment, Shipment.
• Value Object: Money, Tenant, Result, ValidationResult.
• Domain Event: OrderPlaced, PaymentAuthorized, InvoiceCreated, ShipmentCreated.
• Specification: fachliche Prüfregeln für Bestellung, Risiko und Retoure.
Architektur-Muster
• Hexagonal Architecture: Ports in Richtung Fachlichkeit, Adapter nach außen.
• Anti-Corruption Layer: externe Provider und Legacy-Systeme werden übersetzt.
• Outbox: Ereignisse werden transaktional gespeichert und später veröffentlicht.
• Saga: langlaufende kommerzielle Prozesse werden kompensierbar orchestriert.
• CQRS: Schreibmodell und Lesemodell sind getrennt.
Code-Markierung
Im Code sind Muster mit // PATTERN: markiert. Jedes Modul enthält zusätzlich eine README.md und README.html.
Tatsächlich implementierte Patterns der Produktionsreferenz
| Pattern | Zweck | Einsatzort | Begründung |
|---|---|---|---|
| Aggregate Root | Invarianten und Statusmaschine schützen | otc-reference-application/.../domain/Order.java | Alle Änderungen an Bestellung und Positionen laufen über eine fachliche Grenze. |
| Value Object | Geld, IDs und Positionen validieren | Money, OrderId, CustomerId, ProductId | Ungültige Zustände werden bereits beim Erzeugen verhindert. |
| Ports & Adapters | Domäne von JPA, Kafka, Payment und Inventory entkoppeln | application/port und adapter | Fachlogik bleibt testbar und technische Adapter austauschbar. |
| Saga | Payment und Inventory koordinieren | CheckoutService | Bei fehlendem Bestand wird die Payment-Autorisierung kompensiert. |
| Transactional Outbox | DB-Commit und Kafka zuverlässig verbinden | OutboxEntity, OutboxRelay | Verhindert verlorene Events zwischen Datenbank und Broker. |
| Idempotency Key | Doppelte POST-Anfragen vermeiden | IdempotencyRepository | Wiederholte Requests liefern dieselbe Bestellung. |
| CQRS Read Model | API-Modell von Domain-Interna trennen | OrderView | Leseseite bleibt stabil, ohne Aggregate direkt zu serialisieren. |