Ich habe einen Programmierartikel gelesen, in dem das Decorator-Muster erwähnt wurde. Ich habe eine Weile lang programmiert, aber ohne irgendeine formale Ausbildung oder Schulung, aber ich versuche, etwas über die Standardmuster und dergleichen zu lernen.
Also habe ich den Decorator nachgeschlagen und einen Wikipedia-Artikel darüber gefunden. Ich verstehe jetzt das Konzept des Decorator-Musters, war aber etwas verwirrt über diese Passage:
Betrachten Sie als Beispiel ein Fenster in einem Fenstersystem. Um das Scrollen des Fensterinhalts zu ermöglichen, möchten wir ihm gegebenenfalls horizontale oder vertikale Bildlaufleisten hinzufügen. Angenommen, Fenster werden durch Instanzen der Window-Klasse dargestellt, und diese Klasse verfügt über keine Funktionalität zum Hinzufügen von Bildlaufleisten. Wir könnten eine Unterklasse von ScrollingWindow erstellen, die diese bereitstellt, oder wir könnten einen ScrollingWindowDecorator erstellen, der diese Funktionalität zu vorhandenen Window-Objekten hinzufügt. Zu diesem Zeitpunkt wäre jede Lösung in Ordnung.
Nehmen wir nun an, wir möchten auch die Möglichkeit haben, unseren Fenstern Rahmen hinzuzufügen. Auch hier hat unsere ursprüngliche Window-Klasse keine Unterstützung. Die ScrollingWindow-Unterklasse wirft nun ein Problem auf, da sie effektiv eine neue Art von Fenster erstellt hat. Wenn wir allen Fenstern Rahmenunterstützung hinzufügen möchten, müssen wir Unterklassen WindowWithBorder und ScrollingWindowWithBorder erstellen. Offensichtlich wird dieses Problem mit jeder neuen Funktion, die hinzugefügt wird, noch schlimmer. Für die Decorator-Lösung erstellen wir einfach einen neuen BorderedWindowDecorator. Zur Laufzeit können wir vorhandene Fenster mit dem ScrollingWindowDecorator oder dem BorderedWindowDecorator oder beiden nach Belieben dekorieren.
OK, wenn sie sagen, dass allen Fenstern Rahmen hinzugefügt werden sollen, warum nicht einfach der ursprünglichen Fensterklasse Funktionen hinzufügen, um die Option zuzulassen? Untergeordnete Klassen dienen meiner Ansicht nach nur dazu, einer Klasse bestimmte Funktionen hinzuzufügen oder eine Klassenmethode zu überschreiben. Wenn ich allen vorhandenen Objekten Funktionen hinzufügen müsste, warum sollte ich dann nicht einfach die Superklasse ändern?
Es gab eine andere Zeile im Artikel:
Das Dekorationsmuster ist eine Alternative zur Unterklasse. Unterklassen fügen Verhalten zur Kompilierungszeit hinzu, und die Änderung wirkt sich auf alle Instanzen der ursprünglichen Klasse aus. Dekorieren kann zur Laufzeit für einzelne Objekte ein neues Verhalten bereitstellen.
Ich verstehe nicht, wo sie sagen "... die Änderung wirkt sich auf alle Instanzen der ursprünglichen Klasse aus" - wie ändert die Unterklasse die übergeordnete Klasse? Ist das nicht der springende Punkt bei der Unterklassifizierung?
Ich gehe davon aus, dass der Artikel, wie viele Wikis, einfach nicht klar geschrieben ist. Ich kann den Nutzen des Decorators in der letzten Zeile sehen - "... zur Laufzeit neues Verhalten für einzelne Objekte bereitstellen."
Ohne dieses Muster gelesen zu haben, hätte ich, wenn ich das Verhalten zur Laufzeit für einzelne Objekte ändern müsste, wahrscheinlich einige Methoden in die Ober- oder Unterklasse eingebaut, um dieses Verhalten zu aktivieren / deaktivieren. Bitte helfen Sie mir, die Nützlichkeit des Dekorateurs wirklich zu verstehen, und warum ist mein Nachwuchsdenken fehlerhaft?