Fassadenentwurfsmuster in Java

1. Einleitung

In diesem kurzen Tutorial werfen wir einen Blick auf eines der strukturellen Entwurfsmuster: die Fassade .

Zunächst geben wir einen Überblick über das Muster, listen seine Vorteile auf und beschreiben, welche Probleme es löst.

Anschließend wenden wir das Fassadenmuster auf ein vorhandenes, praktisches Problem mit Java an.

2. Was ist eine Fassade?

Einfach ausgedrückt, eine Fassade kapselt ein komplexes Subsystem hinter einer einfachen Schnittstelle. Es verbirgt einen Großteil der Komplexität und macht das Subsystem einfach zu bedienen.

Wenn wir das komplexe Subsystem direkt verwenden müssen, können wir dies trotzdem tun. Wir sind nicht gezwungen, die Fassade ständig zu benutzen.

Neben einer viel einfacheren Benutzeroberfläche bietet die Verwendung dieses Entwurfsmusters noch einen weiteren Vorteil. Es entkoppelt eine Client-Implementierung vom komplexen Subsystem. Dank dessen können wir Änderungen am vorhandenen Subsystem vornehmen und haben keinen Einfluss auf einen Client.

Lassen Sie uns die Fassade in Aktion sehen.

3. Beispiel

Nehmen wir an, wir wollen ein Auto starten. Das folgende Diagramm stellt das Legacy-System dar, mit dem wir dies tun können:

Wie Sie sehen können, kann es sehr komplex sein und erfordert einige Anstrengungen, um den Motor richtig zu starten :

airFlowController.takeAir() fuelInjector.on() fuelInjector.inject() starter.start() coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP) coolingController.run() catalyticConverter.on()

In ähnlicher Weise erfordert das Abstellen des Motors auch einige Schritte:

fuelInjector.off() catalyticConverter.off() coolingController.cool(MAX_ALLOWED_TEMP) coolingController.stop() airFlowController.off()

Eine Fassade ist genau das, was wir hier brauchen. Wir werden die gesamte Komplexität in zwei Methoden verbergen: startEngine () und stopEngine () .

Mal sehen, wie wir es umsetzen können:

public class CarEngineFacade { private static int DEFAULT_COOLING_TEMP = 90; private static int MAX_ALLOWED_TEMP = 50; private FuelInjector fuelInjector = new FuelInjector(); private AirFlowController airFlowController = new AirFlowController(); private Starter starter = new Starter(); private CoolingController coolingController = new CoolingController(); private CatalyticConverter catalyticConverter = new CatalyticConverter(); public void startEngine() { fuelInjector.on(); airFlowController.takeAir(); fuelInjector.on(); fuelInjector.inject(); starter.start(); coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP); coolingController.run(); catalyticConverter.on(); } public void stopEngine() { fuelInjector.off(); catalyticConverter.off(); coolingController.cool(MAX_ALLOWED_TEMP); coolingController.stop(); airFlowController.off(); }

Um ein Auto zu starten und zu stoppen, benötigen wir nur 2 Codezeilen anstelle von 13:

facade.startEngine(); // ... facade.stopEngine();

4. Nachteile

Das Fassadenmuster zwingt uns nicht zu unerwünschten Kompromissen, da es nur zusätzliche Abstraktionsebenen hinzufügt.

Manchmal kann das Muster in einfachen Szenarien überbeansprucht werden, was zu redundanten Implementierungen führt.

5. Schlussfolgerung

In diesem Artikel haben wir das Fassadenmuster erläutert und gezeigt, wie es auf einem vorhandenen System implementiert werden kann.

Die Implementierung dieser Beispiele finden Sie auf GitHub.