Strukturmuster: Fassade


... [ Seminar Objektorientierter Entwurf] ... [ Thema Entwurfsmuster ] ... [ Literaturverzeichnis ] ...

šbersicht: Strukturmuster: Fassade


Fassade

( Facade ) Ist ein objektbasiertes Strukturmuster.


Zweck

Es soll für die Anzahl von Schnittstellen eines Subsystems eine einzige Schnittstelle bieten. Die Fassade vereinfacht so die Benutzung des Subsystems


Motivation

Stellen Sie sich vor, Sie wollen einen Compiler schreiben. Sie haben Scanner- und Parserklassen, ein Programmknotenerbauer und Codegeneratorklassen. Alle diese Klassen werden für den Compiler gebraucht. Nur die Benutzung dieser Klassen ist aufwendig. Sie müssen jede Klasse erzeugen und die richtigen Methoden aufrufen, Sie müssen alle Schnittstellen der Klassen kennen.
Zur Vereinfachung ziehen wir diese Klassen zu einem Subsystem zusammen und setzen eine Klasse Uebersetzer als Schnittstelle ein.


fassade1.gif nicht gefunden...

Diese Uebersetzer-Klasse stellt dem Klienten eine einfache Schnittstelle( Methode Uebersetze() ) zur Verfügung. Sie erzeugt und steuert die Klassen des Subsystems, diese Klasse ist die Fassade.


fassade2.gif nicht gefunden...

Die Fassade dient dazu, zusammengehörige Klassen zu einem Subsystem zusammenzufassen. Der Zugriff auf dieses Subsystem wird über eine einzige Schnittstelle, die Fassade gesteuert.


Anwendbarkeit


Verwenden Sie das Fassadenmuster immer dann, wenn


Struktur


fassade3.gif nicht gefunden...


Teilnehmer


Interaktion


Konsequenzen

  1. Das Subsystem wird einfacher nutzbar durch die Reduzierung von zu verwaltenden Objekten.
    Es braucht nur die Fassade verwaltet zu werden. Die Fassade schirmt den Benutzer von den einzelnen Subsystemkomponenten ab.
  2. Die lose Kopplung zwischen Klienten und Subsystem wird gefördert.
    Dadurch können Komponenten des Subsystems leichter ausgetauscht werden. Es muß nur die Fassade angepaßt werden.
  3. Der Klient kann entscheiden, ob er die Fassade benutzt oder die Subsystemklassen direkt verwendet.


Implementierung

  1. Reduzierung der Kopplung zwischen Klient und Subsystem.
    Sie können die Fassade zu einer abstrakten Klasse machen. Die konkreten Unterklassen repräsentieren unterschiedliche Implementationen des Subsystems. Der Klient kommuniziert mit dem Subsystem nur über die Schnittstelle der abstrakten Fassadenklasse, ihm ist nur diese Schnittstelle bekannt.
  2. Öffentliche oder private Subsystemklassen.
    Eine Klasse kapselt Methoden und Eigenschaften. Ein Subsystem kapselt Klassen. Bei einer Klasse gibt es einen öffentlichen und einen privaten Teil der Schnittstelle.
    Auch bei einem Subsystem sollten Sie über einen öffentlichen und einen privaten Teil der Schnittstelle nachdenken. Die Fassade gehört natürlich zu dem öffentlichen Teil. Aber auch einige Subsystemklassen, die von außen zugreifbar sein sollen, gehören zum öffentlichen Teil.
    In meinen einführenden Beispiel gehört zum öffentlichen Teil der Schnittstelle die Fassade "Uebersetzer", aber auch die Klassen Parser und Scanner.


Beispielcode

Die Klassen Scanner um aus einem Zeichenstrom einen Tokenstrom zu erzeugen:

public class Scanner{

        DataInputStream eingabe;

	public Scanner(DataInputStream i){...};

	public Token Scan(){...};

}

Die Klasse Parser benutzt einen ProgrammKnotenErbauer, um einen Parsebaum aus den Token des Scanners zu erstellen:

public class Parser{

       public Parser(){...}

       public void Parse(Scanner s, ProgrammKnotenErbauer erbauer){...}
     
}

Die Klasse ProgrammKnotenErbauer um den ParseBaum aufzubauen:

class ProgrammKnotenErbauer{

      ProgrammKnoten knoten;
      // die Klasse ProgrammKnoten und ihre Unterklassen
      // (Anweisungsknoten, Ausdrucksknoten) werden als vorhanden 
      // angenommen

      public ProgrammKnotenerbauer(){...}
   
      public ProgrammKnoten NeueVariable(String variablenNamen){...}
      public ProgrammKnoten NeueZuweisung(ProgrammKnoten variable, ProgrammKnoten ausdruck){...}
      public ProgrammKnoten NeueRueckkehrAnweisung(ProgrammKnoten wert){...}
      public ProgrammKnoten NeueBedingteAnweisung(ProgrammKnoten bedingung, ProgrammKnoten wahrZweig, ProgrammKnoten falschZweig){...}

      public ProgrammKnoten GibWurzelKnoten(){...}

}

Die Klasse CodeGenerator (Eine Klasse nach dem Besuchermuster):

class CodeGenerator{
      
      ByteCodeStream ausgabe;  // ByteCodeStream eine eigene Klasse

      public CodeGenerator(ByteCodeStream b){...}

      public void Besuche(AnweisungKnoten anw){...}
      public void Besuche(Ausdrucksknoten aus){...}
      // ....

}

Die Fassade-Klasse Uebersetzer :

public class Uebersetzer{

      public Uebersetzer(){..}

      public void Uebersetze(DataInputStream eingabe, ByteCodeStream ausgabe){
            Scanner scanner = new Scanner(eingabe);
            ProgrammKnotenErbauer erbauer;
            Parser parser;

            parser.Parse(scanner, erbauer);

            RISCCodeGenerator generator(ausgabe);
            ProgrammKnoten parsebaum = erbauer.GobWurzelKnoten();
            parseBaum.Traversiere(generator);
      }

}


Bekannte Verwendungen


Verwandte Muster


... [ Seminar Objektorientierter Entwurf] ... [ Thema Entwurfsmuster ] ... [ Strukturmuster: Fassade] ... [ Literaturverzeichnis ] ...