Immer wenn ich eine Facade-Klasse schreibe, muss ich an die zahlreichen Western Filme denken. Dort wirken die Western-Dörfer so echt! In der Wirklichkeit sind das nur Kulissen oder auch Fassaden, die nur einen Zweck erfüllen, nämlich ein Western-Dorf dar zu stellen. Was genau sich dahinter verbirgt das wissen wir meistens nicht, ehrlich gesagt, wir wollen es auch nicht wissen. Den wir möchten, dass der Wester-Film uns Unterhaltung bittet. Genau das macht das Facade-Entwurfsmuster.

Die Fassade (engl. facade) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Strukturmuster (Structural Patterns). Es bietet eine einheitliche und meist vereinfachte Schnittstelle zu einer Menge von Schnittstellen eines Subsystems oder in unseren Gebiet der PHP-Klassen.

Wenn ein Subsystem viele technisch orientierte Klassen enthält, die selten von außen verwendet werden, hilft es, eine Fassade zu verwenden. Die Fassade ist eine Klasse mit ausgewählten Methoden, die eine häufig benötigte Untermenge an Funktionalität des Subsystems umfasst. Sie delegiert die Funktionalität an andere Klassen des Subsystems und vereinfacht dadurch den Umgang mit dem Subsystem. Die Facade bündelt also viele einzelne Methoden des Subsystems zu einer leicht verständlichen Methode für den Programmierer. Hier eine grafische Darstellung, damit wir es uns besser vorstellen können:

facade-pattern-php
facade-pattern-php

Vorteile
Die Fassade fördert die lose Kopplung, weil mehrere Schnittstellen zu einer zusammengefasst werden und senkt die Komplexität, da es das zugrunde liegende Subsystem versteckt. Außerdem kann das Subsystem durch die lose Kopplung leichter erweitert werden. Die Vorteile sind also: Schirmt Klienten von Subsystem ab, Einfacher und sicherer zu benutzen, Geringere Kopplung, Weniger Übersetzungsabhängigkeiten.

Nachteile
Der Nachteil besteht darin, dass zusätzlicher Ballast bei einfachen Subsystemen entstehen kann, oder auch die Funktionalität / Flexibilität eingeschenkt werden.

Anwendung
Als ein Anwendungsbeispiel habe ich hier eine reale Situation, besser gesagt einen Vorgang aus mein Leben, etwas abstrakt dar gestellt. Also, ich besuche oft meinen besten Freund Max. Zum Max fahre ich mit mein Auto oder setze mich einfach in den Bus und lasse mich fahren. Max besitzt wie jeder Mensch auch Eigenschaften, wie Hartfarbe oder Gewicht. Er hat auch erweiterte Eigenschaften wie: einen festen Wohnsitz. Also eine Straße, eine Hausnummer, eine PLZ und ein Ort. Das ganze würde dann so in einer PHP-Facade-Klasse aussehen:

final class MyFriendMax_Facade
{
    private $oMyFriendMax = null;

    public function __construct()
    {
        $this->oMyFriendMax = new MyFriendMax();
    }

    public function visitByCar()
    {
        $oMyCar = new MyCar();

        $oMyCar->fillUpWithPetrol()
            ->setStreet($this->oMyFriendMax->getStreet())
            ->setHouseNumber($this->oMyFriendMax->getHouseNumber())
            ->setZipCode($this->oMyFriendMax->getZipCode())
            ->setTown($this->oMyFriendMax->getTown())
            ->drive();
    }

    public function visitByBus()
    {
        $oPublicBus = new PublicBus();

        $oPublicBus->buyTicket(new Ticket2000())
            ->setStreet($this->oMyFriendMax->getStreet())
            ->setHouseNumber($this->oMyFriendMax->getHouseNumber())
            ->setZipCode($this->oMyFriendMax->getZipCode())
            ->setTown($this->oMyFriendMax->getTown())
            ->setBusStation($this->oMyFriendMax->getBusStation())
            ->drive();
    }
}

Wenn ich den Max mit dem Auto besuche, weiß ich, dass das Auto erst mit Benzin getankt wird und dass ich seine Anschrift wissen muss. Ich weiß aber auch, dass wenn ich mit den Bus besuchen fahren möchte, ich ein Ticket kaufen und an der richtigen Haltestelle aussteigen muss. Das alles habe ich in diese Facade abgebildet. So würde das aussehen.

$oMyFriendMax_Facade = new MyFriendMax_Facade();
$oMyFriendMax_Facade->visitByCar();
// ...oder ..
$oMyFriendMax_Facade->visitByBus();

In Zukunft brauche ich mir keine Gedanken darüber zu machen, was alles ich unternehmen muss um Max zu besuchen. Ich verwende einfach die MyFriendMax_Facade und besuche ihn einfach mit dem Auto oder fahre eben mit dem Bus. So kann jeder beliebiger Mensch den Max einfach mit MyFriendMax_Facade besuchen, ohne zu wissen, was genau er dafür unternehmen muss. Toll oder? :-)

2 thoughts on “Das Facade Pattern

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.