Konstantin Prokudin 10. Juni 2011 Adapter-Muster Fassade-Muster Quellen Beispiel aus dem Leben Objektorientierte Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Adapter: Vor- und Nachteile Zusammenfassung Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Sie brauchen Strom? Dann eine Steckdose suchen. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Sie finden eine Steckdose... … aber sie passt für Ihren Stecker nicht! Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Schnittstellenproblem: unserer Stecker soll eine Steckdose verwenden. Der Stecker kann jedoch auf das Ziel nicht zugreifen, da der Stecker eine andere Schnittstelle erwartet als die, die von der Steckdose angeboten wird. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Der Stecker wird in einen Adapter gesteckt. Der Adapter bietet die Schnittstelle an, die der Stecker benötigt. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Die Steckdose bietet eine Schnittstelle für den Bezug von Strom Dieser Stecker erwartet eine andere Schnittstelle. Der Adapter konvertiert eine Schnittstelle in eine andere. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Das Adapter-Muster konvertiert die Schnittstelle einer Klasse in die Schnittstelle, die der Client erwartet. Adapter ermöglicht die Zusammenarbeit von Klassen, die ohne nicht zusammenarbeiten könnten, weil sie inkompatible Schnittstellen haben. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Client Ziel Klasse • Ihre Schnittstelle passt nicht zur Ziel-Klasse Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Client Adapter Ziel Klasse • Der Adapter implementiert die Schnittstelle, die Ihre Klassen erwarten • Und spricht mit der Ziel - Schnittstelle, um Ihre Anfrage zu erledigen Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Client • Keine Adapter Ziel Klasse Code-Änderung beim Client und Ziel-Klasse Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung 1. Der Client stellt eine Anfrage an den Adapter, indem er unter Verwendung der Ziel-Schnittstelle eine Methode auf ihm aufruft. 2. Der Adapter übersetzt diese Anfrage in ein oder mehrere Aufrufe auf das Adaptierte, für die er die AdaptiertenSchnittstelle verwendet. 3. Der Client empfängt die Ergebnisse des Aufrufs und erfährt nie, dass da ein Adapter ist, der eine Übersetzung durchführt. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung benutzt adaptiert adaptiert.spezifischeOperation() Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung begrenzungsRahmen(); zeichne(); TextAnzeige passt nicht zu GraphischesObjekt Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Zulieferer-Klasse public class TextAnzeige { private int ursprung; private int hoehe; private int breite; private String text; public int getUrsprung(){ return ursprung; } public int getHoehe(){ return hoehe; } public int getBreite(){ return breite; } public String zeigMich(){ return text; } Adapter public class TextAdapter { private TextAnzeige text; // Konstruktor public ZeichenAdapter(TextAnzeige text) {this.text = text;} // Rahmen public Rahmen begrenzungsrahmen(){ text.getHoehe(); text.getBreite(); ... } // Text public Zeichen zeichne(){ ... text.zeigMich(); ... } } } Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Aufruf des Adapters public class TestAdapter { public static void main(String[] args) { TextAdapter text = new TextAdapter(new TextAnzeige()); text.begrenzungsrahmen(); text.zeichne(); } } Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Klassen-Adapter benutzt mehrfache Vererbung um unser Objekt anzupassen bildet der Adapter eine Unterklasse des Adaptierten und des Ziels Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Der einzige Unterschied zwischen den beiden Adaptern ist, dass bei einem Klassen-Adapter eine Unterklasse des Ziels und der Adaptierten Klasse gebildet wird, während beim Objekt-Adapter Komposition verwendet wird, um die Anfragen an das Adaptierte zu übergeben. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Es gibt zwei besondere Vorgehensweisen, wenn man das Adaptermuster verwenden möchte. Zum einen kann man eine Klasse gleich mit einem steckbaren Adapter ausstatten. Zum anderen kann man eine Klasse auch für mehrere Klienten gleichzeitig, mit einem n-Weg-Adapter, zugänglich machen. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Wenn man eine Klasse möglichst allgemein wieder verwendbar schreiben möchte, kann man sie mit einem steckbaren Adapter ausstatten. Hierzu gibt man dieser Klasse abstrakte Methoden, die ein Adapter später implementieren muss. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Eine Adapterklasse kann mehrere Interfaces implementieren, um so für zwei oder mehr Klienten nutzbar zu sein. Dies nennt man einen n-/zwei-WegAdapter. Der n-Weg-Adapter ist sowohl in Java als auch in C zu verwirklichen. Jeder „normale“ ein-WegAdapter ist im Prinzip ein Spezialfall des n-WegAdapters. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung keine Codeänderung Wiederverwendbarkeit von Softwareprojekten geringere Kosten kürzere Entwicklungszeiten Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung zusätzliche Delegationsschicht Einfluss auf die Performance Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Eine Klasse soll eine andere Klasse verwenden, die aber keinen passenden Schnittstellen hat oder die Quellcode von der Klasse nicht bekannt ist. Als Lösung wird eine Klasse Adapter implementiert, die die nötigen Schnittstelle liefert. Adapter: Inhalt Beispiel aus dem Leben Problem Lösung Definition Objekt-Adapter Beispiel: Zeicheneditor Klassen-Adapter Spezielle Adapter Vor- und Nachteile Zusammenfassung Problem Lösung Fassade Fassade: Beispiel Heimkino Fassade: noch ein Beispiel Fassade: Vor- und Nachteile Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Um in einem System eine möglichst hohe Kohäsion zu erreichen, muss in der Regel für jede Funktionalität auch eine eigene Klasse bereitgestellt werden. Das führt im Laufe der Entwicklung eines Software-Projekts zu immer zahlreicheren Klassen und immer mehr Abhängigkeiten zwischen ihnen. Um die Komplexität des Gesamtsystems zu verringern, kann es in Subsysteme unterteilt werden. Es bestehen aber weiterhin die Probleme, dass ein Klient für die Nutzung der gewünschten Funktionen innerhalb eines Subsystems auf viele Subsystemobjekte zugreifen muss. Das bedeutet Unübersichtlichkeit und hohe Kopplung. Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Clients Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Den oben beschriebenen Problemen kann man durch die Anwendung des Fassade Pattern entgegenwirken. Die Fassade steht dabei zwischen den Clients, die Funktionen eines Subsystem nutzen wollen, und dem Subsystem selbst. Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Clients Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Das Subsystem kann aus Klassen, Funktionen, Datenstrukturen oder weiteren Subsystemen bestehen. Die Komponenten des Subsystems implementieren die Funktionalität. Sie wissen nichts von einer möglichen Fassade. Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Clients wollen die Subsystemfunktionalität nutzen. Vor Einführung der Fassade müssen sie dazu auf die einzelnen Komponenten des Subsystems zugreifen, nach Einführung der Fassade laufen alle Anfragen nur noch über sie. Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Die Fassade stellt eine abstrakte Schnittstelle für den Zugriff auf die Subsystemfunktionen zur Verfügung. Sie steht zwischen den Klienten und den Subsystemkomponenten und leitet die Anfragen der Klienten weiter. Dazu muss die Fassade alle Subsystemkomponenten und deren Schnittstellen kennen. Möglicherweise muss sie selbst Funktionalität implementieren, um ihre Schnittstelle auf die der Klienten abzubilden. Die Fassade sollte den Zugriff auf die Funktionen des Subsystems möglichst weit vereinfachen. Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Sie haben ein System mit einem DVD-Player, einem Beamer, einer automatischen Leinwand, SurroundSound und einer Popcorn-Maschine zusammengestellt. Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Das sind viele Klassen, viele Interaktionen und eine große Menge an Schnittstellen, die gelernt und verwendet werden müssen. Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Die Popcorn-Maschine einschalten Die Popcorn-Maschine starten Die Beleuchtung dimmen Die Leinwand herunterfahren Den Beamer einschalten Den Beamer –Eingang auf DVD schalten Den Beamer in den Breitwandmodus versetzen Den Verstärket einschalten Den Verstärkereingang auf DVD setzen Den Verstärker auf Surround-Sound setzen Die Verstärkerlautstärke auf Mittel setzen Den DVD-Spieler einschalten Den DVD-Spieler starten um ein Film anzuschauen Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile public class HeimkinoFassade { Verstärker verstärker; Tuner tuner; DVDSpieler dvd; CDSpieler cd; Beamer beamer; Beleuchtung beleuchtung; Leinwand leinwand; PopcornMaschine popcorn; // Konstruktor public HeimkinoFassade(Verstärker amp, Tuner tuner, DVDSpieler dvd, CDSpieler cd, Beamer beamer, Leinwand leinwand, Beleuchtung beleuchtung, PopcornMaschine popcorn){ this.verstärker = amp; this.tuner = tuner; this.dvd = dvd; this.cd = cd; this.beamer = beamer; this.beleuchtung = beleuchtung; this.leinwand = leinwand; this.popcorn = popcorn; } } Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile public void filmSchauen(String film){ System.out.println("Film fängt an"); popcorn.ein(); popcorn.starten(); beleuchtung.dimmen(10); leinwand.runter(); beamer.ein(); beamer.breitwandModus(); verstärker.ein(); verstärker.setDVD(); verstärker.setSurroundSound(); verstärker.setLautstärke(5); dvd.ein(); dvd.spielen(); } public void filmBeenden(){ System.out.println(“Film zum Ende"); popcorn.aus(); beleuchtung.ein(); leinwand.hoch(); beamer.aus(); verstärker.aus(); dvd.anhalten(); dvd.auswerfen(); dvd.aus(); } Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile public class HeimkinoTest { public static void main(String[] args){ HeimkinoFassade heimkino = new HeimkinoFassade(verstärker, tuner, dvd, cd, beamer, leinwand, beleuchtung, popcorn); heimkino.filmSchauen("Lost in translation"); heimkino.filmBeenden(); } } Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Die Fassade kann den Klienten für ein komplexes Subsystem eine einheitliche Schnittstelle bieten und so die Verwendung des Subsystems weniger aufwendig und fehleranfällig machen Die Fassade entkoppelt die Klienten vom Subsystem. Es werden die Abhängigkeiten zwischen beiden reduziert, was zu besserer Wiederverwendbarkeit und Portabilität führt Die Fassade kann verwendet werden, um ein System in Schichten aufzuteilen. Sie definiert dabei den Eintrittspunkt zu jeder Subsystemschicht Für große Software-Projekte ist es wichtig, den Übersetzungsaufwand zu reduzieren. Durch Fassaden kann verhindert werden, dass eine kleine Änderung eine neue Übersetzung des gesamten Systems erfordert. Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Die Verwendung einer Fassade bedeutet immer eine zusätzliche Indirektionsstufe. Falls ihre Anwendung nicht wirklich erforderlich ist, da zum Beispiel das Subsystem sehr einfach und gut zu benutzen ist, stellt sie nur einen zusätzlichen Ballast dar. Insbesondere an zeitkritischen Stellen sollte auf ihren Einsatz verzichtet werden Die Fassade soll vereinfachen. Das hat aber zur Konsequenz, dass meist nur bestimmte Funktionen des Subsystems bereitgestellt werden. Die Fassade kann also möglicherweise die Funktionalität / Flexibilität des Subsystems einschränken. Fassade: Inhalt Problem Lösung Fassade Beispiel Heimkino Noch ein Beispiel Vor- und Nachteile Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates Entwurfsmuster von Kopf bis Fuß O'Reilly, Cambridge, 2004 Dr. Günter Kniesel, Institut für Informatik III, Universität Bonn http://roots.iai.uni-bonn.de/teaching/vorlesungen/2007aswt/downloads/folien/06design-patterns-d-20070510.pdf Katrin Solveig Lohan & Matthias Hillebrand http://www.techfak.unibielefeld.de/~dstoesse/SeminarDesignPatterns/Adapter_Handout.pdf Quellen