zurück zum Artikel

Patterns in der Softwareentwicklung: Das Strukturpattern Fassade

Rainer Grimm

(Bild: Roberto Rizzi / Shutterstock.com)

Die Fassade bietet eine vereinfachte Schnittstelle zu einem komplexen System an. Es gehört zu den Strukturmustern.

Patterns sind eine wichtige Abstraktion in der modernen Softwareentwicklung. Sie bieten eine klar definierte Terminologie, eine saubere Dokumentation und das Lernen von den Besten. Das klassische Buch "Design Patterns: Elements of Reusable Object-Oriented Software" (kurz Design Patterns), das ich in meiner Serie über Muster vorstelle, enthält 23 Muster. Die Fassade ist ein Strukturmuster. und hat einen Zweck: eine vereinfachte Schnittstelle zu einem komplexen System zu schaffen.

Eine Fassade definiert eine übergeordnete Schnittstelle, die die Nutzung des Subsystems erleichtert. Die Absicht der übergeordneten Schnittstelle ist es, nicht alle Anwendungsfälle des komplexen Systems zu unterstützen, sondern nur die wichtigsten. Trotz der Fassade für die vereinfachte Schnittstelle ist es oft noch möglich, das komplexe System direkt zu nutzen.

Die Fassade ist ein idealer Startpunkt, um komplexe Systeme durch die Einführung von Schichten zu entkoppeln. Außerdem kann es als Ausgangspunkt für die Abschaffung der alten Schnittstelle verwendet werden

Hier sind die Fakten:

Zweck

Anwendungsfall

Struktur

Facade

Package

Das folgende Beispiel stammt aus dem Wikibuch C++Programming: code patterns design [1].

// from https://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/\
                Design_Patterns#Facade

#include <string>
#include <iostream>

using namespace std;

class Alarm                                                 // (2)
{
public:
	void alarmOn()
	{
		cout << "Alarm is on and house is secured"<<endl;
	}

	void alarmOff()
	{
		cout << "Alarm is off and you can go into the house"<<endl;
	}
};

class Ac                                                    // (3)
{
public:
	void acOn()
	{
		cout << "Ac is on"<<endl;
	}

	void acOff()
	{
		cout << "AC is off"<<endl;
	}
};

class Tv                                                    // (4)
{
public:
	void tvOn()
	{
		cout << "Tv is on"<<endl;
	}

	void tvOff()
	{
		cout << "TV is off"<<endl;
	}
};

class HouseFacade                                           // (1)
{
	Alarm alarm;
	Ac ac;
	Tv tv;

public:
	HouseFacade(){}

	void goToWork()                                          // (5) 
	{
		ac.acOff();
		tv.tvOff();
		alarm.alarmOn();
	}

	void comeHome()                                          // (6)
	{
		alarm.alarmOff();
		ac.acOn();
		tv.tvOn();
	}
};

int main()
{
	HouseFacade hf;

	// Rather than calling 100 different on and off functions
	// thanks to facade I only have 2 functions...
	hf.goToWork();
	hf.comeHome();
}

Die Klasse HouseFacade (1) vereinfacht die Verwendung der Klassen Alarm, Ac und TV (2 bis 4). Die vereinfachte Schnittstelle besteht aus den beiden Mitgliedsfunktionen goToWork (5) und comeHome (6). Beide Mitgliedsfunktionen kapseln nicht nur die zugrunde liegenden Mitgliedsfunktionen der ursprünglichen Schnittstelle, sondern garantieren auch, dass die Mitgliedsfunktionen in der richtigen Reihenfolge aufgerufen werden.

Abschließend ist hier die Ausgabe des Programms:

Die Fassade ist wahrscheinlich das am häufigsten verwendete Entwurfsmuster.

Im Allgemeinen kommt die Fassade zum Einsatz, wenn eine Funktion aufgerufen wird, die einen Aufruf des Betriebssystems auslöst. Hier sind ein paar Beispiele:

Verwandte Muster

Vorteile

Nachteile

In meinem nächsten Artikel stelle ich das verbleibende Strukturmuster aus dem Buch "Design Patterns: Elements of Reusable Object-Oriented Software [16]" genauer vor: das Proxy-Muster. Das Proxy-Muster [17] wird als Platzhalter für den Zugriff auf ein anderes Objekt verwendet. ( [18])


URL dieses Artikels:
https://www.heise.de/-7331425

Links in diesem Artikel:
[1] https://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns#Facade
[2] https://en.wikipedia.org/wiki/Pthreads
[3] http://www.cs.rpi.edu/courses/fall06/netprog/WindowsThreads.html
[4] https://en.wikipedia.org/wiki/Threading_Building_Blocks
[5] https://learn.microsoft.com/en-us/cpp/parallel/concrt/parallel-patterns-library-ppl?view=msvc-170
[6] https://en.cppreference.com/w/cpp/filesystem
[7] https://en.cppreference.com/w/cpp/chrono
[8] https://en.cppreference.com/w/cpp/numeric
[9] https://en.cppreference.com/w/cpp/utility/format
[10] https://en.wikipedia.org/wiki/Adapter_pattern
[11] https://en.wikipedia.org/wiki/Abstract_factory_pattern
[12] https://en.wikipedia.org/wiki/Mediator_pattern
[13] https://en.wikipedia.org/wiki/Singleton_pattern
[14] https://en.wikipedia.org/wiki/God_object
[15] https://heise.de/-7274558
[16] https://en.wikipedia.org/wiki/Design_Patterns
[17] https://en.wikipedia.org/wiki/Proxy_pattern
[18] mailto:rainer@grimm-jaud.de