5 Entwurfsmuster Flashcards
Was ist ein Entwurfsmuster?
Darstellung wiederkehrender Entwurfslösungen in objektorientierten Softwaresystemen.
Abstrahiert relevante Aspekte einer allgemeinen Entwurfsstruktur durch Identifikation
- der teilnehmenden Klassen und Objekte,
- der Rollen
- der Interaktionen zwischen den Rollen und
- der ihnen zugeteilten Aufgaben
Jedes Entwurfsmuster assoziiert eine bestimmte Klasse von objektorientierten Entwurfsproblemen.
Entwurfsmuster enthalten typischerweise:
- abstrakte Klassen(also nicht instanziierbar)
- konkrete Klassen zur Konkretisierung des Musters
Nennen Sie die Klassifikationen von Entwurfsmustern.
Nach Aufgabe:
Erzeugungsmuster (creational) z.B. abstract factory, singleton, (factory method)
Strukturmuster (structural) z.B. adapter, proxy, bridge, decorator, composite, (facade, flyweight)
Verhaltensmuster (behavioral) z.B. template method, command, observer, strategy, visitor, chain of responsibility
Nach Gültigkeitsbereich:
Klassenbasiert
Objekt- bzw. Instanzbasiert.
Beschreiben Sie kurz das Entwurfsmuster ‘Singleton’ (wozu wird es eingesetzt und wie sieht es aus)
Wird eingesetzt, wenn nur eine Instanz einer Klasse verfügbar sein soll auf der globale Operationen ausgeführt werden.
Enthält Klassenvariable singletonInstance, die die einzige Instanz von Singleton enthält.
Typischerweise ist eine Methode getInstance() vorhanden, die wie folgt aussieht:
Singleton getInstance() { if (singletonInstance == null) singletonInstance = new Singleton(); return singletonInstance; }
Wichtig: der Konstruktor von Singleton ist private. Forciert Umweg über getInstance().
Verwendung typischerweise: Singleton.getInstance().singletonOperation();
Beschreiben Sie kurz das Entwurfsmuster ‘Abstract Factory’ (wozu wird es eingesetzt und wie sieht es aus)
Wird eingesetzt um eine Schnittstelle zum konsistenten Erzeugen verwandter oder voneinander abhängiger Produkte anzubieten, ohne die ihrer gemeinsamen Erzeugung zugrundeliegende Fabrik benennen zu müssen.
AbstractFactory -> ConreteFactory1, ConcreteFactory2 … ConcreteFactoryN
ConreteFactory1 -> ConcreteProduct1A -> ConcreteProduct1B ... -> ConcreteProduct1Z
Beispiel:
Abstract GUI-Factory
- > MotifFactory (Unix)
- > PMFactory (O/S 2)
- > MacFactory (Mac)
Beschreiben Sie kurz das Entwurfsmuster ‘Adapter’ (wozu wird es eingesetzt und wie sieht es aus)
Adapter bezeichnet ein Strukturmuster.
Übersetzung einer vorgegebenen Schnittstelle einer Klasse in eine andere Schnittstelle, wie sie von einem Client erwartet wird.
Zwei Varianten:
- Adapter mit Vererbung (klassenbasiert)
- Adapter mit Delegation (objektbasiert)
Klassenbassiert:
Adapter1 erbt von Dienst und implementiert Interface.
Aufruf: Adapter1.anfrage() -> Adapter1.service()
Objektbasiert:
Adapter1 hat Referenz auf Dienst und implementiert Interface.
Aufruf: Adapter1.anfrage() -> Dienst.service()
Beschreiben Sie kurz das Entwurfsmuster ‘Bridge’ (wozu wird es eingesetzt und wie sieht es aus)
Bridge bezeichnet ein objektorientiertes Strukturmuster.
Durch Einsatz des Brücke-Entwurfsmusters werden Schnittstellen und Implementierungen in zwei getrennte Vererbungshierarchien organisiert.
Sie ermöglicht es, die Implementierung erst zur Laufzeit auszuwählen bzw. zu variieren.
Beschreiben Sie kurz das Entwurfsmuster ‘Proxy’ (wozu wird es eingesetzt und wie sieht es aus)
Proxy bezeichnet ein objektorientiertes Strukturmuster.
Kontrolliert Zugriff auf ein Objekt mit Hilfe eines vorgelagerten Stellvertreterobjekts.
Erlaubt in Abhängigkeit vom Kontrollergebnis eventuell zusätzliche Diensterbringung seitens des Proxy.
Klient -> Subject (abstract)
Proxy -> Subject (abstract)
RealSubject -> Subject (abstract)
Proxy gibt im Bedarfsfall Methoden an RealSubject weiter.
Beschreiben Sie kurz das Entwurfsmuster ‘Decorator’ (wozu wird es eingesetzt und wie sieht es aus)
Decorator bezeichnet ein objektorientiertes Strukturmuster.
Dynamische Erweiterung der Zuständigkeit eines Dienstes eines Objekts zur Laufzeit.
Beispiel für mehrstufige Dekorierer: FrameDecorator dekoriert ScrollbarDecorator dekoriert TextView
Decorator —> Component (interface)
Decorator (aggregates) –> Component (interface)
ConcreteComponent1 -> Component
ConcreteComponent2 -> Component
…
ConcreteDecoratorA -> Decorator
ConcreteDecoratorB -> Decorator
…
Beschreiben Sie kurz das Entwurfsmuster ‘Composite’ (wozu wird es eingesetzt und wie sieht es aus)
Kompositum bezeichnet ein objektbasiertes Strukturmuster.
Objekte werden zu einer Baumstruktur zusammengefügt, um eine Teil-Ganzes-Hierarchie zu repräsentieren.
Ermöglicht, dass Klienten sowohl einzelne Objekte als auch Kompositionen von Objekten einheitlich behandeln können.
operation() wird an alle Kindobjekte propagiert.
Rekursiv, falls Kind wieder Composite ist.
Falls Kind ein Blattknoten darstellt, wird die eigentliche Operation ausgeführt.
Composite — (composite-aggregates) —> 0..* Components
Beschreiben Sie kurz das Entwurfsmuster ‘Template Method’ (wozu wird es eingesetzt und wie sieht es aus)
Schablonenmethode bezeichnet ein klassenbasiertes Verhaltensmuster.
Schablonenhafte Beschreibung eines Algorithmus, die bezüglich einer Reihe von Implementierungsdetails Freiheitsgrade zulässt (z.B. zu verwendende Such-bzw. Sortierverfahren); diese werden nachträglich (spätestens zur Übersetzungszeit) festgelegt.
AbstractClass:
+ templateMethod() // uses primitiveOperation1 and 2 internally
+ primitiveOperation1() (abstract)
+ primitiveOperation2() (abstract)
ConcreteClass -> AbstractClass implements:
+ primitiveOperation1()
+ primitiveOperation2()
Beschreiben Sie kurz das Entwurfsmuster ‘Command’ (wozu wird es eingesetzt und wie sieht es aus)
Befehl bezeichnet ein objektorientiertes Verhaltensmuster.
Befehle werden in Objekte gekapselt um:
- Befehle potentiellen Aufrufern als Parameter zu übergeben,
- Befehle durch eine Queue zu verwalten,
- ein Logbuch über ausgeführte Befehle zu führen
- und damit Befehle rückgängig zu machen.
Beispiel: Menüeinträge (GUI)
Makrobefehl: Sequentielle Zusammenfassung von mehreren auszuführenden Befehlen.
Beschreiben Sie kurz das Entwurfsmuster ‘Observer’ (wozu wird es eingesetzt und wie sieht es aus)
Beobachter bezeichnet ein objektbasiertes Verhaltensmuster.
Änderungen an einem Objekt sollen auf alle weiteren davon abhängigen Objekte konsistent übertragen werden.
Dies soll erfolgen, ohne die betroffenen Objekte (geänderte und anzupassende) in eine gemeinsame Klasse integrieren zu müssen.
Typisches Beispiel: Mehrere views auf gleiche Daten.
- > Tabelle (beobachtet Daten)
- > Säulendiagramm (beobachtet Daten)
- > Kuchendiagramm (beobachtet Daten)
Data —-|> Subject (abstract) —-> 0..* Observer (abstract)
Beschreiben Sie kurz das Entwurfsmuster ‘Strategy’ (wozu wird es eingesetzt und wie sieht es aus)
Strategie ist ein objektbasiertes Verhaltensmuster.
Einige Teile einer Aufgabe können unterschiedlich gelöst werden.
Die aktuelle Variante soll zur Laufzeit vom Klient auswählbar sein.
Der nicht variable Teil der Aufgabe soll nur einmal gespeichert werden, um Redundanz zu vermeiden.
Beispiel: Textverarbeitung enthält nicht variable Textverwaltungsfunktionen sowie variable Formatierungen.
Beschreiben Sie kurz das Entwurfsmuster ‘Chain of Responsibility’ (wozu wird es eingesetzt und wie sieht es aus)
Zuständigkeitskette ist ein objektbasiertes Verhaltensmuster.
Der Klient kennt zur Laufzeit nicht genau den Bearbeiter der von ihm erwünschten Anfrage.
Zur Bearbeitung spezieller Anfragen kommen unterschiedliche Diensterbringer in Frage.
Die Menge der für einen speziellen Dienst in Frage kommenden Bearbeiter soll dynamisch festlegbar sein.
Beispiel: Kontextsensitive Hilfe.