Der Quellcode hat nur das Ziel, die in der Artikelserie beschriebenen Konzepte zur verdeutlichen. Der Code ist nicht lauffähig. Der Code sollte kompilieren.
Zur Verdeutlichung der Verwendung von Dependency Injecton wird die Library Google Guice eingesetzt. Google Guice ist nicht vollständig konfiguriert. Auch hier ist das Ziel "nur" den Einsatz der Verwendung zu verdeutlichen.
Am Beispiel des Package Fahrzeug wird das Output Adapter Factory Pattern beschrieben. Der FahrzeugService ist Konsument einer Adapter-Implementierung des Package adapter.out. Darunter sind die Factory und die beteiligten Adapter-Implementierung abgelegt.
Die Service Strategie ist am Beispiel einer Schnell- und Exaktenbewertung verdeutlicht im Package fahrzeugbewertung.strategy.
Das Service Decorator Pattern wird ebenfalls am Beispiel der Fahrzeugbewertung in Abhängigkeit von drei Nutzergruppen beschrieben. Die Implementierung der Dekorierer befindet sich im Package fahrzeugbewertung.decorator.
Ergänzend zu Kapitel 2 ist der FahrzeugbewertungsService als Element des Service Decorator Pattern, ebenfalls Konsument des Supporting Services SendEmail.
Das Output Adapter Commnd Facade Pattern wird im vgl. zum Artikel detailliert im Package fahrzeugbewertung.facade. veranschaulicht. Die folgende Abbildung visualisiert das implementierte Beispiel. Die Commands der Fassade befindet sich im Package fahrzeugbewertung.facade.adapterfacade.usecase. Die Adapterfassade nutzt diese Use Case zur Orchestrierung der fachlichen Teilfunktionen, abgebildet als Adapter-Implementierung. Die Komplexität aufgrund der Interaktion mit dem externen System, befindet sich nicht (direkt) in der Domäne. Dies führt zu einem verständlicheren Entwurf, insbesondere wenn die Domäne noch weitere Aufgaben erfüllen muss, wie z.B. die Kalkulation des durchschnittlichen Marktpreises durch Interaktion mit einem anderen externen System Use Case Out für die kalkultion des durchschnittlichen Marktpreises.
Zur beispielhaften Beschreibung des Shared Output Adapter Pattern wird das Geschätfsobjekt Fahrzeug verwendet. Die Fahrzeugdaten werden von einem externen Service abgefragt wird. Zwei Konsumenten, das Package fahrzeugbewertung.decorator. und das Package fahrzeugangebot benötigen einen unterschiedlichen Umfang der Fahrzeugdaten und führen unabhängige Geschäftslogik auf diesen Daten aus. Jeder Konsument hat sein Domänenmodell. Der Shared Output Adapter mappt jeweils auf das Domänenmodell des Konsumenten. Die ausgehenden Use Cases, die der Shared Output Adapter implementiert, gehören zu den Konsumenten und sind dort in der Paketstruktur verortet.
Das Supporting Service Pattern wird am Beispiel eines Service für den Emailversand beschrieben.
Im Package
supporting.service.email
befindet sich die Klasse EmailService, die das Interface SendMail implementiert.
SendMail hat dabei den Charakter eines ausgehenden Use Cases und wird vom Domain Service FahrzeugangebotService des Package
fahrzeugangebot.domain.service
sowie vom dem FahrzeugbewertungsService des Package
fahrzeugbewertung.decorator.domain.service
verwendet.
Der Baustein Ersatzteile hat die Aufgabe eine Teileliste zu einem Fahrzeug zu erstellen. Dabei nutzt das Package ersatzteil das Package fahrzeug über den eingehenden Use Case ReadFahrzeug. Die fachliche Beziehung wird über einen Application Service (TeilelisteApplicationService) aufgelöst. Dieser ist Abhängig vom Package fahrzeug und dessen Entitäten in fahrzeug.domain.model. Der Kern der Domäne von Teileliste bleibt jedoch unabhängig vom Baustein Fahrzeug, wenn dies der Application Service überführt in die Entitäten der Domäne von ersatzteil.domain.model.
Der FahrzeugangebotService in fahrzeugangebot.domain.service enthält die Geschäftslogik für die Erstellung eines rechtsgültigen Angebots für den Verkauf eines Gebrauchtwagens. Dabei wird der Händlerverkaufswert benötigt. Dieser wird der im Package Fahrzeugbewertung (fahrzeugbewertung.decorator) berechnet wird. Zur Abbildung der fachlichen Beziehungen zwischen den Bausteinen wird das Adapter.Out - Usecase.in Pattern eingesetzt.
Im Package fahrzeugangebot.adapter.out befindet sich der AngebotspreisAdapter, der den ausgehenden Use Case CalcualteAngebotspreis des Packages fahrzeugangebot.usecase.out implementiert. Der AngebotspreisAdapter referenziert einen eingehenden Use Case von fahrzeugbewertung.decorator.usecase.in der Fahrzeugbewertung und führt über diesen die Kalulation durch. Durch das Mapping im Adapter, sind beide Domänen der Package fahrzeugbewertung.decorator und fahrzeugangebot technisch voneinander unabhängig und maximal möglich entkoppelt.