Muster und strukturen klasse 1

Die ADT-Instanz kann nun zur Laufzeit zwischen verschiedenen Körperklassen «metamorphisieren». Sie müssen einen anderen Weg finden, um Benachrichtigungsklassen zu strukturieren, damit ihre Anzahl nicht versehentlich einen Guinness-Rekord bricht. Die Dekorateure und die Datenquellenklasse implementieren dieselbe Schnittstelle, wodurch sie alle im Clientcode austauschbar sind. Die CompoundGraphic-Klasse ist ein Container, der eine beliebige Anzahl von Unterformen, einschließlich anderer zusammengesetzter Formen, umfassen kann. Eine zusammengesetzte Form hat die gleichen Methoden wie eine einfache Form. Anstatt jedoch etwas für sich zu tun, übergibt eine zusammengesetzte Form die Anforderung rekursiv an alle ihre Kinder und «fasst» das Ergebnis zusammen. Die Musterquelle scheint [Koenig1995] zu sein. Siehe auch [Cargill1996]. Das Erweitern einer Klasse ist das erste, was Ihnen in den Sinn kommt, wenn Sie das Verhalten eines Objekts ändern müssen. Die Vererbung hat jedoch einige schwerwiegende Vorbehalte, die Sie beachten müssen. Chain of Responsibility und Decorator haben sehr ähnliche Klassenstrukturen. Beide Muster basieren auf rekursiver Komposition, um die Ausführung durch eine Reihe von Objekten zu übergeben. Es gibt jedoch einige entscheidende Unterschiede.

Objekte, die Abstraktionen darstellen, die «innerhalb» des Programms leben und eng mit dem Berechnungsmodell, der Implementierung oder der Programmiersprache verknüpft sind, sollten als lokale (automatische oder statische) Instanzen oder als Memberinstanzen deklariert werden. Auflistungsklassen (Zeichenfolge, Liste, Satz) sind Beispiele für diese Art der Abstraktion (obwohl sie Heapdaten verwenden können, sind sie selbst keine Heapobjekte). Sie sind konkrete Datentypen – sie sind nicht «abstrakt», sondern so konkret wie int und doppelt. Jede Klasse sollte wissen, wie sie sich selbst zu ihrem eigenen Basisklassentyp heraufstufen kann. Werbeaktionen, die mehr als zwei Ebenen der Vererbungshierarchie umfassen, können durch mehrere aufeinander folgende Aktionen verarbeitet werden. Viele Programmiersprachen haben das letzte Schlüsselwort, das verwendet werden kann, um eine weitere Erweiterung einer Klasse zu verhindern. Für eine letzte Klasse besteht die einzige Möglichkeit, das vorhandene Verhalten wiederzuverwenden, darin, die Klasse mithilfe des Decorator-Musters mit einem eigenen Wrapper zu umschließen. Sie können Ihrer Visitor-Klasse eine setContext()-Methode hinzufügen, die dem Besucher mitteilt, in welchem Kontext die folgenden Objekte interpretiert werden müssen. Insgesamt beschäftigt sich diese Mustersprache mit einem Aspekt des C++-Designs: Insbesondere geht es um diesen Aspekt, der sich auf algebraische Typen konzentriert.

C++ ist reich an Features, die algebraische Typen unterstützen, einschließlich Operatorüberlastung und einer guten Familie integrierter numerischer Typen. Die Idiome, die die algebraische Ansicht umgeben, sind stark genug, dass die Tradition in Bibliotheken für Zeichenfolgen und andere nicht-numerische Typen fortführt. Es gibt viele nicht numerische und, richtigerweise, nicht-algebraische Typen, auf die viele dieser Muster angewendet werden können. Stellen Sie sicher, dass alle Klassen die Komponentenschnittstelle implementieren. Objekte, die reale Entitäten darstellen, die außerhalb des Programms leben, sollten vom Heap mit dem Operator new instanziiert werden. Die Lebensdauer dieser Objekte ist wahrscheinlich unabhängig von der Lebensdauer einer Prozedur oder eines Klassenbereichs, daher ist es unklug, sie als Objekte in einem beliebigen Bereich zu deklarieren. Window ist ein Beispiel für eine solche Klasse. 1) Wenn 2 Schnittstellen nicht miteinander kompatibel sind und eine Beziehung zwischen ihnen über einen Adapter herstellen möchten, wird das so genannte Adapterentwurfsmuster erstellt. Adaptermuster konvertiert die Schnittstelle einer Klasse in eine andere Schnittstelle oder Klassen, die der Client erwartet, dass Adapter Klassen zusammenarbeiten lässt, die sonst aufgrund von Inkompatibilität nicht funktionieren könnten.