Fliegengewicht Ein objektbasiertes Strukturmuster
FLIEGENGEWICHT - Objektbasiertes Strukturmuster - Zweck: - effektive Nutzung von Objekten kleinster Granularität --> dadurch Senkung von Speicherkosten - extrahieren kontextabhängiger Informationen Verringerung der absoluten Anzahl von Objektinstanzen - Vergl.: Kompositionsmuster Baumstruktur von kleineren Objekten
FLIEGENGEWICHT - intrinsischer / extrinsischer Zustand: - intrinsischer Zustand wird im Fliegengewicht gespeichert - er besteht ausschließlich aus der vom Kontext des Fliegen- gewichtes unabhängigen Information --> dadurch wird Fliegengewicht gemeinsam nutzbar - extrinsischer Zustand abhängig vom Kontext des Fliegen- gewichts und wechselt mit ihm - Fliegengewicht wird durch Klientobjekte mit benötigtem extrinsischem Zustand versorgt
FLIEGENGEWICHT - Beispiel: Dokumenteditor - intrinsischer Zustand: Zeichencode eines jeweiligen Buchstabens im Alphabet - extrinsischer Zustand: graphische Positionierung, typographischer Stil ausgehend von den Layout-Algorithmen des Editors --> jedes Auftreten eines Zeichens zu einem bestimmten Kontext verweist auf eine gemeinsam genutzte Menge von Fliegen- gewichtobjekten
FLIEGENGEWICHT - Struktur: Fliegengewicht (Klasse) deklariert Schnittstelle, durch die Fliegengewichte einen extrinsischen Zustand erhalten und verarbeiten können KonkretesFliegengewicht (Zeichen) implementiert die Fliegengewicht-Schnittstelle und hält den intrinsischen Zustand FliegengewichtFabrik erzeugt und verwaltet Fliegengewicht-Objekte und stellt sicher, daß Fliegengewichte auf korrekte Weise gemeinsam genutzt werden Klient verwaltet eine Referenz auf Fliegengewichte und berechnet/speichert deren extrinsischen Zustand
FLIEGENGEWICHT - Implementierung: Fliegengewicht GLYPH – Schnittstelle für extrinsischen Zustand (als Verbindung von Zeichen und Formatierung) class Glyph { public: virtual void Zeichne (Fenster*,GlyphKontext&); virtual void SetzeZeichensatz (Zeichensatz*,GlyphKontext&); … } Glyphkontext – Abbildung zwischen Glyphobjekt und Zeichensatz (wird durch Glyph aktualisiert ; liefert Zeichensatz eines Glyphobjektes) class GlyphKontext { public: GlyphKontext(); … } Bsp.: GlyphKontext glyphKontext; glyphKontext.SetzeZeichensatz(timesKursiv 12,6); 6 ist dann der Index im BBaum, der auf den Zeichensatz timesKursiv12 verweist (konkretes) Fliegengewicht ZEICHEN – speichert Zeichencode class Zeichen { public: Zeichen(char); … }
FLIEGENGEWICHT - Implementierung: FliegengewichtFabrik – erzeugt Glyphobjekte (sichert gemeinsame Nutzung von Zeichen-Objekten) class GlyphFabrik { public: GlyphFabrik (); virtual Zeichen* ErzeugeZeichen (char); … } ErzeugeZeichen sucht ein Zeichen aus einem Array und gibt das entsprechende Glyphobjekt zurück. Falls dieses Zeichen nicht existiert wird das Glyphobjekt erzeugt, im Array abgelegt und zurückgegeben.
FLIEGENGEWICHT - Einsatzbedingungen: - eine Anwendung verwendet eine große Menge von Objekten - Speicherkosten allein aufgrund der Anzahl von Objekten groß - Großteil des Objektzustands kann extrinsisch gemacht (in den Kontext verlagert) werden - viele Gruppen von Objekten können durch relativ wenige gemeinsam genutzte Objekte ersetzt werden
FLIEGENGEWICHT - Konsequenzen: - mögliche Laufzeitkosten durch Transferieren, Aufsuchen oder Berechnen des extrinsischen Zustands - Speichergewinne abhängig von: + Reduzierung der Gesamtmenge an Objekten aufgrund möglicher gemeinsamer Nutzung + Größe des intrinsischen Zustands pro Objekt + Speicherung oder Berechnung des extrinsischen Zustands - Speicherplatz wird eingespart: + je mehr Fliegengewichte gemeinsam genutzt werden + wenn Objekte einen großen Teil sowohl intrinsischen als auch extrinsischen Zustands verwenden + wenn der extrinsische Zustand berechnet werden kann und nicht gespeichert werden muß
FLIEGENGEWICHT - bekannte Verwendungen: - Konzept der Fliegengewichtobjekte erstmals in InterViews 3.0 beschrieben und als Entwurfstechnik untersucht --> Entwicklung des Dokumenteditors Doc + Doc verwendete Glyphobjekte zur Representation jedes einzelnen Zeichens im Dokument + Erzeugung eines Glyphexemplars für jedes Zeichen eines bestimmten Stils, der seine graphischen Attribute definiert somit: intrinsisch = Zeichencode und Stilinformation (Index aus Stiltabelle) extrinsisch = nur die Position (dadurch hohe Geschwindigkeit) --> in einem typischen Anwendungsfall mussten für ein aus Zeichen bestehendes Dokument lediglich 480 Zeichenobjekte alloziert werden