Brücke [ Übersicht ] [ Beispiel ] [ Quellen ] [ Home Entwurfsmuster ]


Beispiel

Als Beispiel einer Bridge nehmen wir den abstrakten Datentyp Schlange als Abstraktion. Eine Schlange kann unterschiedlich implementiert werden, als:

  • einfach verkettete Schlange
  • doppelt verkettete Schlange
  • Ringspeicher
Im folgenden Beispiel können Sie Character-Zeichen (maximal 6) in eine Schlange einfügen und löschen. Im oberen Bereich können Sie zwischen den einzelnen Implementierungen der Schlange wählen bzw. umschalten. Beim Wechsel der Implementierung bleiben in diesem Appletbeispiel die Elemente in der Schlange enthalten. Man kann die Schlange auch leeren, jedoch soll hiermit verdeutlicht werden, dass sich an der Abstraktion "Schlange" und ihrer Funktionalität, und daher auch an ihren Elementen nichts ändert - nur die Art der Implementierung wechselt.



Beschreibung

Eine Anwendung, in unserem Fall das obere Applet-Beispiel, benötigt eine Schlange, das heißt, ein Objekt der Klasse "KonkrSchlange". Um unterschiedliche Implementierungen dieser Schlange zuzulassen, wird der "KonkrSchlange" ein Attribut vom Typ "AbstrSchlangeImplementierer" hinzugefügt.

Dies veranschaulicht das rechte Diagramm. Wie zu sehen ist, wurden drei konkrete Implementierungen für die Schlange umgesetzt. Da es in der "KonkrSchlange" eine Referenz auf einen "AbstrSchlangeImplementierer" gibt, sind die Implementierungen zur Laufzeit untereinander austauschbar. Man kann die für seine Anforderungen passende Implementierung wählen.


Der "AbstrSchlangeImplementierer" kann man als Interface oder als abstrakte Klasse umsetzen. In der Beispielanwendung wurde ein Interface verwendet, um die Methoden einer Schlange zu definieren:
public interface AbstrSchlangeImplementierer
{	
    public void insertElement(char w);
    public void removeElement();
    public char getFirstElement();
    public char getAndRemoveElement();
    public boolean isEmpty();
    public boolean isFull();
    public int getAnzahl();
}
Wenn im Applet eine bestimmte Implementierung der Schlange gewählt wird, dann wird die Referenz auf einen "AbstrSchlangeImplementierer" in der "KonkrSchlange" entsprechend gesetzt. Die unterschiedlichen Implementierungen der Schlange wurden deklariert als:
private "AbstrSchlangeImplementierer" s1, s2, s3;

s1 = new EinfachVerketteteSchlange();
s2 = new DoppeltVerketteteSchlange();
s3 = new RingspeicherSchlange();
Das Ändern der Implementierungen geschieht wie folgt:
public void checkboxAction()
{
    if (g.getSelectedCheckbox().getLabel() == "Einfach verkettete Schlange") {
   	schlange.setSchlangeImplementierer(s1);
    } else if (g.getSelectedCheckbox().getLabel() == "Doppelt verkettete Schlange") {
   	schlange.setSchlangeImplementierer(s2);
    } else if (g.getSelectedCheckbox().getLabel() == "Schlange als Ringspeicher") {
   	schlange.setSchlangeImplementierer(s3);
    }
}
Die Operationen an die "KonkrSchlange", wie Einfügen oder Löschen eines Elementes, werden an die entsprechende Implementierung weitergeleitet, wo sie dann ausgeführt werden. Somit sieht die Methode zum Einfügen eines Elementes in einer "KonkrSchlange" wie folgt aus:
public void insertElement(char w)
{
    impl.insertElement(w);
}

[ Übersicht ] [ Beispiel ] [ Quellen ] [ Home Entwurfsmuster ]
Stand: 03.04.2006, Autor: Karin Haack