listen:kompositum:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
listen:kompositum:start [2024/09/19 09:57] – angelegt Martin Pabst | listen:kompositum:start [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Entwurfsmuster allgemein ====== | ||
- | |||
- | <WRAP center round info 80%> | ||
- | **Entwurfsmuster** (englisch **design patterns**) sind bewährte Lösungsschablonen (hier: Klassen und deren Beziehungen) für wiederkehrende Entwurfsprobleme. Ihre Verwendung sorgt für leichter wartbaren Programmcode. Sie reduziert damit den Aufwand und auch die Kosten bei der Softwareentwicklung. \\ \\ | ||
- | // | ||
- | </ | ||
- | |||
- | ===== Implementierung einer Liste mit dem Entwurfsmuster " | ||
- | Der Nachfolger des letzten Elementes der Liste soll nicht mehr den Wert '' | ||
- | |||
- | {{ : | ||
- | |||
- | Damit das Attribut '' | ||
- | |||
- | ==== Klassendiagramm ==== | ||
- | {{ : | ||
- | |||
- | ==== Implementierung ==== | ||
- | Die Klasse '' | ||
- | <code learnj> | ||
- | public class Inhalt { | ||
- | |||
- | | ||
- | |||
- | | ||
- | this.text = text; | ||
- | } | ||
- | |||
- | | ||
- | println(text); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | Die Klasse '' | ||
- | <code learnj> | ||
- | abstract class Listenelement { | ||
- | | ||
- | | ||
- | | ||
- | |||
- | // Bemerkung: | ||
- | // Bei Knoten-Objekten gibt die Methode hintenAnfügen das Objekt selbst wieder zurück. | ||
- | // Bei Abschluss-Objekten gibt die Methode das neue eingefügte Knoten-Objekt zurück. | ||
- | } | ||
- | </ | ||
- | |||
- | Die Klasse '' | ||
- | |||
- | <code learnj> | ||
- | class Liste { | ||
- | |||
- | | ||
- | | ||
- | | ||
- | erster = new Abschluss(); | ||
- | } | ||
- | |||
- | | ||
- | Listenelement alterErster = erster; | ||
- | erster = erster.getNachfolger(); | ||
- | return alterErster.getInhalt(); | ||
- | } | ||
- | |||
- | | ||
- | // Genau dann, wenn erster ein Abschluss-Objekt ist, wird die | ||
- | // folgende Anweisung den Wert von erster ändern. | ||
- | erster = erster.hintenAnfügen(inhalt); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | Ein Objekt der Klasse '' | ||
- | |||
- | <code learnj> | ||
- | class Knoten extends Listenelement { | ||
- | | ||
- | | ||
- | |||
- | | ||
- | return nachfolger; | ||
- | } | ||
- | | ||
- | | ||
- | this.inhalt = inhalt; | ||
- | this.nachfolger = nachfolger; | ||
- | } | ||
- | | ||
- | | ||
- | this.inhalt = inhalt; | ||
- | nachfolger = l; | ||
- | } | ||
- | |||
- | | ||
- | return inhalt; | ||
- | } | ||
- | |||
- | | ||
- | nachfolger = nachfolger.hintenAnfügen(inhalt); | ||
- | return this; | ||
- | } | ||
- | |||
- | } | ||
- | </ | ||
- | |||
- | Das '' | ||
- | <code learnj> | ||
- | class Abschluss extends Listenelement { | ||
- | | ||
- | return null; | ||
- | } | ||
- | | ||
- | | ||
- | return this; | ||
- | } | ||
- | |||
- | | ||
- | Knoten k = new Knoten(inhalt, | ||
- | return k; // gibt eine Referenz auf den neuen Knoten an das aufrufende Objekt zurück | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | ===== Das ganze Programm zum Ausprobieren ===== | ||
- | < | ||
- | |||
- | <div class=" | ||
- | |||
- | <script type=" | ||
- | Liste liste = new Liste(); | ||
- | |||
- | liste.hintenAnfügen(new Inhalt(" | ||
- | liste.hintenAnfügen(new Inhalt(" | ||
- | liste.hintenAnfügen(new Inhalt(" | ||
- | |||
- | Inhalt i = liste.erstenEntnehmen(); | ||
- | i.ausgabe(); | ||
- | |||
- | i = liste.erstenEntnehmen(); | ||
- | i.ausgabe(); | ||
- | |||
- | i = liste.erstenEntnehmen(); | ||
- | i.ausgabe(); | ||
- | </ | ||
- | |||
- | <script type=" | ||
- | abstract class Listenelement { | ||
- | | ||
- | | ||
- | | ||
- | |||
- | // Bemerkung: | ||
- | // Bei Knoten-Objekten gibt die Methode hintenAnfügen das Objekt selbst wieder zurück. | ||
- | // Bei Abschluss-Objekten gibt die Methode das neue eingefügte Konten-Objekt zurück. | ||
- | } | ||
- | </ | ||
- | |||
- | <script type=" | ||
- | class Liste { | ||
- | |||
- | | ||
- | | ||
- | | ||
- | erster = new Abschluss(); | ||
- | } | ||
- | |||
- | | ||
- | Listenelement alterErster = erster; | ||
- | erster = erster.getNachfolger(); | ||
- | return alterErster.getInhalt(); | ||
- | } | ||
- | |||
- | | ||
- | // Genau dann, wenn erster ein Abschluss-Objekt ist, wird die | ||
- | // folgende Anweisung den Wert von erster ändern. | ||
- | erster = erster.hintenAnfügen(inhalt); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | <script type=" | ||
- | class Knoten extends Listenelement { | ||
- | | ||
- | | ||
- | |||
- | | ||
- | return nachfolger; | ||
- | } | ||
- | | ||
- | | ||
- | this.inhalt = inhalt; | ||
- | this.nachfolger = nachfolger; | ||
- | } | ||
- | | ||
- | | ||
- | this.inhalt = inhalt; | ||
- | nachfolger = l; | ||
- | } | ||
- | |||
- | | ||
- | return inhalt; | ||
- | } | ||
- | |||
- | public Listenelement hintenAnfügen(Inhalt inhalt) { | ||
- | nachfolger = nachfolger.hintenAnfügen(inhalt); | ||
- | return this; | ||
- | } | ||
- | |||
- | } | ||
- | </ | ||
- | |||
- | <script type=" | ||
- | class Abschluss extends Listenelement { | ||
- | | ||
- | return null; | ||
- | } | ||
- | | ||
- | | ||
- | return this; | ||
- | } | ||
- | |||
- | | ||
- | Knoten k = new Knoten(inhalt, | ||
- | return k; | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | <script type=" | ||
- | class Inhalt { | ||
- | |||
- | | ||
- | |||
- | | ||
- | this.text = text; | ||
- | } | ||
- | |||
- | | ||
- | println(text); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | </ | ||
- | |||
- | </ | ||
- | |||
- | ===== Aufgaben zur Listenimplementierung mit Kompositum ===== | ||
- | [[.listenaufgaben: | ||
- | |||
- | ===== Trennung von Struktur und Inhalt ===== | ||
- | <WRAP center round info 60%> | ||
- | Im obigen Beispiel muss die Inhaltsklasse nicht verändert werden, wenn die Funktionalitäten der Liste programmiert werden. Das Prinzip **" | ||
- | |||
- | **Bemerkung: | ||
- | </ | ||
- | |||
- | ====== Das Entwurfsmuster " | ||
- | Die Kernidee des Entwurfsmusters " | ||
- | |||
- | <WRAP center round info 80%> | ||
- | Das **Entwurfsmuster Kompositum** (engl. composite) dient als Lösungsansatz für Situationen, | ||
- | {{ : | ||
- | **Bemerkung: | ||
- | </ | ||
- | |||
- | ===== Beispiel: Dateisystem ===== | ||
- | Eine Möglichkeit zur anschaulichen Anwendung des Kompositums auf eine vertraute Struktur bietet das Dateisystem, | ||
- | {{ : | ||
- | Wie gewohnt kann ein Laufwerk hier Dateien und Ordner enthalten, ein Ordner wiederum (Unter-)Ordner und Dateien (die keine weiteren Objekte enthalten). Gemeinsame Methoden könnten z.B. der Ermittlung der Größe von Dateien und Ordnern dienen. Die Klasse Laufwerk steht außerhalb des Entwurfsmusters Kompositum. | ||
- | |||
- | ===== Vorteile/ | ||
- | Gegenüber einer Implementierung mit Knoten-Objekten aber ohne Abschluss-Objekt ergeben sich folgende Vorteile/ | ||
- | **Vorteile: | ||
- | * Gleichbehandlung der unterschiedlichen Listenbestandteile möglich | ||
- | * Keine Überprüfung auf null-Werte mehr | ||
- | * Stärkere Strukturierung | ||
- | **Nachteile: | ||
- | * Programmieraufwand ist höher | ||
- | * Mehr beteiligte Klassen | ||
- | * deutlich schlechtere Performance | ||
listen/kompositum/start.1726739854.txt.gz · Zuletzt geändert: 2024/09/22 04:37 (Externe Bearbeitung)