Muster und strukturen klasse 4

Als Programmierer werden Sie sich irgendwann mit hierarchischen Strukturen von Objekten beschäftigen. Hierarchische Baumstrukturen können in verschiedenen Geschmacksrichtungen kommen, und man kann eine Struktur von Komponenten (denken Sie als Objekte), die entweder Blatt oder Knoten sein können. Ein Blatt ist ein Objekt, das keine untergeordneten Elemente hat, während ein Knoten dies tut. Ein Knoten kann ein oder mehrere Blätter oder andere Knoten haben. Dies wird als rekursive Komposition bezeichnet und kann am besten durch eine Dateisystemverzeichnisstruktur veranschaulicht werden. Um das zusammengesetzte Muster auf das Katalogbeispiel anzuwenden, können wir eine Baumstruktur (auf den Kopf) erstellen und den Stamm der Struktur als abstrakte Klasse, CatalogComponent, modellieren. Diese Klasse definiert das Verhalten einzelner und zusammengesetzter Objekte und fungiert als Schnittstelle der Struktur zu Clients. Beachten Sie, dass wir uns stattdessen auch für eine Java-Schnittstelle hätten festlegen können, aber im Kontext unseres Beispiels würde dies Klassen in der Struktur zwingen, die Implementierung von Methoden bereitzustellen, die für sie nicht relevant sind. Beispielsweise ist eine getProductDiscount()-Methode für ein Produkt für einen Katalog nicht relevant, und wir erwarten nicht, dass der Katalog ihn implementiert.

In der productCatalog-Klasse oben haben wir eine ArrayList instanziiert, um CatalogComponent-Objekte aufzunehmen. Wir haben dann die folgenden zusammengesetzten Methoden implementiert: Wenn häufig neue Vorgänge benötigt werden und die Objektstruktur aus vielen nicht verknüpften Klassen besteht, ist es unflexibel, jedes Mal neue Unterklassen hinzuzufügen, wenn ein neuer Vorgang erforderlich ist, weil “[.] Die Verteilung all dieser Vorgänge auf die verschiedenen Knotenklassen führt zu einem System, das schwer zu verstehen, zu warten und zu ändern ist.” [1] Die Produktklasse, die wir oben geschrieben haben, ist einfach. Als Blatt müssen wir uns keine Sorgen um Kinder machen. Daher haben wir es nur von CatalogComponent erweitert und Implementierungen der Arbeitsmethoden bereitgestellt: getName(), getPrice() und print(). Um das zusammengesetzte Muster auf das Katalogbeispiel anzuwenden, schreiben wir die abstrakte Basisklasse – die Komponente. In diesem Beispiel wird eine separate ExpressionPrinter-Klasse deklariert, die sich um den Druck kümmert. Die Ausdrucksklassen müssen ihre Member freisetzen, um dies zu ermöglichen. Der größte Vorteil dieses Ansatzes besteht darin, dass Sie sich nicht um die konkreten Klassen von Objekten kümmern müssen, aus denen sich der Baum zusammensetzt. Sie müssen nicht wissen, ob ein Objekt ein einfaches Produkt oder eine ausgeklügelte Box ist. Sie können sie alle gleich über die gemeinsame Schnittstelle behandeln.

Wenn Sie eine Methode aufrufen, übergeben die Objekte selbst die Anforderung an die Struktur. Verwenden Sie das zusammengesetzte Muster, wenn Sie eine baumähnliche Objektstruktur implementieren müssen. Ein Nachteil dieses Musters besteht jedoch darin, dass Erweiterungen der Klassenhierarchie dadurch erschwert werden, da neue Klassen in der Regel eine neue Besuchsmethode erfordern, die jedem Besucher hinzugefügt werden muss.