Dieses Projekt stellt eine Beispiel-Implementierung in C++ des Entwurfsmusters Fassade aus dem Bereich der Softwareentwicklung dar.
Die Klasse Motor soll einen mechanischen Motor symbolisieren, welcher durch einen Aufruf der Funktion Motor::zünden()
zum Starten gebracht werden.
Die Klasse Frontscheinwerfer ist eine fiktive Komponente, welche durch die Schnittstelle Frontscheinwerfer::einschalten()
angesprochen werden kann.
Die Klasse Automobil soll ein Modell eines Auto symbolisieren, welches durch einen Aufruf der Funktion Automobil::schlüsseldrehen()
gestartet werden kann. Dieses fiktionale Auto besteht aus mehreren Bestandteilen, unteranderem einem Motor und Frontscheinwerfer. Bim Drehen des Autoschlüssels wird der Motor gezündet und die Frontscheinwerfer werden eingeschaltet.
Die Datenstruktur der Klasse Automobil bildet hier eine Art Fassade, bei der die Schnittstellen des Motors (Motor::zünden()
) und der Frontscheinwerfer (Frontscheinwerfer::einschalten()
) hinter einer einzelnen Schnittstelle (Automobil::schlüsseldrehen()
) verborgen wird:
#include "Automobil.h"
#include "Motor.h"
void Automobil::schlüsseldrehen() {
// Zünde den Motor
motor.zünden();
// Schalte die Frontscheinwerfer ein
frontscheinwerfer.einschalten();
[...]
// Auto wurde gestartet!
}
Das Fahrer-Modell soll abstrakte Clients simulieren, welche auf verschiedene Zugriffsarten die Komponenten Motor und Frontscheinwerfer anprechen sowie aktivieren.
Der "manuelle" Fahrer spricht die Komponenten Motor und Frontscheinwerfer direkt an, überprüft deren Status selbst und hat volle Kontrolle über deren Schnittstellen.
#include "Fahrer.h"
#include "Motor.h"
#include "Frontscheinwerfer.h"
class ManuellerFahrer : public Fahrer {
private:
Motor motor;
Frontscheinwerfer frontscheinwerfer;
public:
void starten() {
cout << "ManuellerFahrer: Beginne das Auto zu starten..." << endl;
// Zünde den Motor
cout << "ManuellerFahrer: Versuche den Motor zu zünden..." << endl;
motor.zünden();
// Schalte die Frontscheinwerfer ein
cout << "ManuellerFahrer: Versuche die Frontscheinwerfer einzuschalten..." << endl;
frontscheinwerfer.einschalten();
// Läuft
cout << "ManuellerFahrer: Motor und Frontscheinwerfer gestartet!" << endl;
}
};
Der "automatische" Fahrer spricht über die Fassadenklasse Automobil die Komponenten Motor und Frontscheinwerfer an, es findet keine direkte Kommunikation zwischen den Schnittstellen statt.
#include "Fahrer.h"
#include "Automobil.h"
class AutomatischerFahrer : public Fahrer {
private:
Automobil automobil;
public:
void starten() {
cout << "AutomatischerFahrer: Beginne das Auto zu starten..." << endl;
// Schlüssel drehen
automobil.schlüsseldrehen();
// Läuft
cout << "AutomatischerFahrer: Motor und Frontscheinwerfer gestartet!" << endl;
}
};
Ablauf "automatischer" Fahrer | Ablauf "manueller" Fahrer |
---|---|
Ein aktueller C++-Compiler (g++
) und das GNU Make Tool (make
) werden vorausgesetzt.
Zu Beginnt wird mit $ make executable
die Kompilierung des Quellcodes gestartet und im Anschluss die generierten Binaries mit den nötigen Rechten für eine Ausführung versehen.
Zuletzt wird mit $ make run
die Ausführung gestartet.
Lukas-MacBook:se_doa_WI201718-facade lukas$ make
g++ -Wall -I./src src/main.cpp src/ManuellerFahrer.cpp src/AutomatischerFahrer.cpp src/Automobil.cpp src/Frontscheinwerfer.cpp src/Motor.cpp -o Automobil
chmod +x Automobil
./Automobil
-------------------------------------
ManuellerFahrer: Beginne das Auto zu starten...
ManuellerFahrer: Versuche den Motor zu zünden...
Motor: Motor wurde gezündet.ManuellerFahrer: Versuche die Frontscheinwerfer einzuschalten...
Frontscheinwerfer: Frontscheinwerfer wurden eingeschaltet.
ManuellerFahrer: Motor und Frontscheinwerfer gestartet!
-------------------------------------
AutomatischerFahrer: Beginne das Auto zu starten...
Automobil: Versuche das Auto mit Motor und Frontscheinwerfer zu starten...
Automobil: Versuche den Motor zu zünden...
Motor: Motor wurde gezündet.
Automobil: Versuche die Frontscheinwerfer einzuschalten...
Frontscheinwerfer: Frontscheinwerfer wurden eingeschaltet.
Automobil: Auto wurde gestartet!
AutomatischerFahrer: Motor und Frontscheinwerfer gestartet!
-------------------------------------
rm -f Automobil