{"id":19929,"date":"2023-07-25T12:52:39","date_gmt":"2023-07-25T12:52:39","guid":{"rendered":"https:\/\/devologyx.io\/entwurfsmuster-elemente-von-wiederverwendbarer-objektorientierter-software\/"},"modified":"2024-10-31T17:54:22","modified_gmt":"2024-10-31T17:54:22","slug":"entwurfsmuster-elemente-von-wiederverwendbarer-objektorientierter-software","status":"publish","type":"post","link":"https:\/\/devologyx.io\/de\/entwurfsmuster-elemente-von-wiederverwendbarer-objektorientierter-software\/","title":{"rendered":"ENTWURFSMUSTER: ELEMENTE VON WIEDERVERWENDBARER OBJEKTORIENTIERTER SOFTWARE"},"content":{"rendered":"\n<p><strong>Kapitel Eins: Einleitung<\/strong><\/p>\n\n<figure class=\"wp-block-image size-large is-resized\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-ann-h-1888003-1024x683.jpg\" alt=\"\" class=\"wp-image-17512\" width=\"462\" height=\"308\" srcset=\"https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-ann-h-1888003-1024x683.jpg 1024w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-ann-h-1888003-300x200.jpg 300w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-ann-h-1888003-768x512.jpg 768w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-ann-h-1888003-1536x1024.jpg 1536w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-ann-h-1888003-2048x1366.jpg 2048w\" sizes=\"(max-width: 462px) 100vw, 462px\" \/><\/figure>\n\n<p>Die Entwicklung von objektorientierter Software ist komplex, und wiederverwendbare objektorientierte Software ist sogar noch anspruchsvoller. Sie m\u00fcssen relevante Objekte finden, sie mit der richtigen Granularit\u00e4t in Klassen einteilen, Klassenschnittstellen und Vererbungshierarchien definieren und wichtige Beziehungen zwischen ihnen herstellen. Ihr Entwurf sollte spezifisch f\u00fcr das Problem und allgemein genug sein, um zuk\u00fcnftige Probleme und Anforderungen zu ber\u00fccksichtigen.  <\/p>\n\n<p><strong>Was ist ein Entwurfsmuster?<\/strong><\/p>\n\n<p>Ein Entwurfsmuster benennt, abstrahiert und identifiziert die kritischen Aspekte einer Standardentwurfsstruktur, die sie bei der Erstellung eines wiederverwendbaren objektorientierten Entwurfs hilfreich machen. Das Entwurfsmuster identifiziert die beteiligten Klassen und Instanzen, ihre Rollen und Kooperationen sowie die Verteilung der Verantwortlichkeiten. Design Patterns beschreiben Probleme in Ihrer Umgebung und erl\u00e4utern den Kern der L\u00f6sung f\u00fcr dieses Problem, so dass Sie diese L\u00f6sung iterativ verwenden k\u00f6nnen. Ein Entwurfsmuster hat vier entscheidende Elemente;   <\/p>\n\n<ol class=\"wp-block-list\">\n<li>Der Name eines Musters ist eine Handhabe, um ein Designproblem, seine L\u00f6sungen und Konsequenzen in ein oder zwei Worten zu beschreiben. Die Benennung eines Musters erm\u00f6glicht es Ihnen, auf einer h\u00f6heren Abstraktionsebene zu entwerfen. <\/li>\n\n\n\n<li>Das Problem: Hier wird erkl\u00e4rt, wann das Muster umgesetzt werden soll. Es erkl\u00e4rt die Situation und ihren Kontext. Beschreibt spezifische Designprobleme, z.B. wie man Algorithmen als Objekte darstellt.  <\/li>\n\n\n\n<li>Die L\u00f6sung: Dies veranschaulicht die Elemente, aus denen der Entwurf besteht, ihre Beziehungen, ihre Zusammenarbeit und ihre Verantwortlichkeiten.<\/li>\n\n\n\n<li>Die Konsequenzen: Das sind die Ergebnisse und Nachteile der Anwendung des Musters.<\/li>\n<\/ol>\n\n<p><strong>Entwurfsmuster in Smalltalk MVC<\/strong><\/p>\n\n<p>Die Model\/View\/Controller (MVC)-Trias von Klassen [KP88] wird zum Aufbau von Benutzeroberfl\u00e4chen in Smalltalk-80 verwendet. Der Model-View-Controller besteht aus drei Arten von Objekten. Das Model ist das Anwendungsobjekt, die View ist seine Bildschirmdarstellung und der Controller definiert, wie die Benutzeroberfl\u00e4che auf Benutzereingaben reagiert. Vor MVC neigten die Entw\u00fcrfe von Benutzeroberfl\u00e4chen dazu, diese Objekte in einen Topf zu werfen. MVC entkoppelt sie dann, um die Flexibilit\u00e4t und Wiederverwendung zu verbessern. MVC entkoppelt Ansichten und Modelle, indem es ein Subscribe\/Notify-Protokoll einf\u00fchrt. Eine Ansicht muss sicherstellen, dass ihr Erscheinungsbild den Zustand des Modells widerspiegelt. Wann immer sich die Daten des Modells \u00e4ndern, werden die davon abh\u00e4ngigen Ansichten dar\u00fcber informiert. Daraufhin erh\u00e4lt jede Ansicht die M\u00f6glichkeit, sich selbst zu aktualisieren. Mit diesem Ansatz k\u00f6nnen Sie mehrere Ansichten an ein Modell anh\u00e4ngen, um verschiedene Darstellungen zu erm\u00f6glichen. Sie k\u00f6nnen auch neue Ansichten f\u00fcr ein Modell erstellen, ohne es neu zu schreiben.          <\/p>\n\n<p>Mit MVC k\u00f6nnen Sie \u00e4ndern, wie eine Ansicht auf Benutzereingaben reagiert, ohne ihre visuelle Darstellung zu \u00e4ndern. Sie k\u00f6nnen z.B. die Reaktion auf die Tastatur \u00e4ndern oder ein Popup-Men\u00fc anstelle von Befehlstasten verwenden. MVC kapselt den Antwortmechanismus in einem Controller-Objekt. Eine Klassenhierarchie von Controllern macht die Erstellung eines neuen Controllers als Variation eines bestehenden Controllers einfach.   <\/p>\n\n<p><strong>Beschreiben von Entwurfsmustern<\/strong><\/p>\n\n<p>Design Patterns werden in einem einheitlichen Format definiert. Jedes Muster ist nach der folgenden Vorlage in Abschnitte unterteilt. Die Vorlage verleiht den Informationen eine einheitliche Struktur, so dass Design Patterns leichter zu lernen, zu vergleichen und zu verwenden sind.  <\/p>\n\n<ul class=\"wp-block-list\">\n<li>Name und Klassifizierung des Musters: Der Name vermittelt kurz und b\u00fcndig das Wesen des Musters. Ein guter Ruf ist wichtig, denn er wird Teil Ihres Designvokabulars. Die Klassifizierung des Musters entspricht dem Schema, das wir in Abschnitt 1.5 vorstellen.    <\/li>\n\n\n\n<li>Absicht: Eine kurze Erkl\u00e4rung, die die folgenden Fragen beantwortet: Was tut das Entwurfsmuster? Was sind seine Gr\u00fcnde und sein Ziel? Welches spezielle Designproblem wird damit angesprochen?    <\/li>\n\n\n\n<li>Auch bekannt als Andere bekannte Namen f\u00fcr das Muster, falls vorhanden.  <\/li>\n\n\n\n<li>Motivation: Ein Szenario, das ein Designproblem veranschaulicht und zeigt, wie die Klassen- und Objektstrukturen des Musters dieses Problem l\u00f6sen. Das System wird Ihnen helfen, die abstraktere Beschreibung des folgenden Musters zu verstehen. <\/li>\n\n\n\n<li>Anwendbarkeit: In welchen Situationen kann das Entwurfsmuster angewendet werden? Was sind Beispiele f\u00fcr schlechte Entw\u00fcrfe, die mit dem Muster behandelt werden k\u00f6nnen? Wie k\u00f6nnen Sie diese Situationen erkennen?    <\/li>\n\n\n\n<li>Struktur: Eine grafische Darstellung der Klassen im Muster unter Verwendung einer Notation, die auf der Object Modeling Technique (OMT) [RBP+91] basiert. Wir verwenden auch Interaktionsdiagramme [JCJO92, Boo94], um die Abfolge von Anfragen und die Zusammenarbeit zwischen Objekten darzustellen. Anhang B beschreibt diese Notationen im Detail.  <\/li>\n\n\n\n<li>Teilnehmer: Die Klassen und\/oder Objekte, die an dem Entwurfsmuster beteiligt sind, und ihre Verantwortlichkeiten.<\/li>\n\n\n\n<li>Kollaborationen: Wie die Teilnehmer zusammenarbeiten, um ihre Aufgaben zu erf\u00fcllen.  <\/li>\n\n\n\n<li>Die Folgen: Wie unterst\u00fctzt das Muster seine Ziele? Was sind die Kompromisse und Ergebnisse der Verwendung des Musters? Welchen Aspekt der Systemstruktur k\u00f6nnen Sie damit unabh\u00e4ngig variieren?    <\/li>\n\n\n\n<li>Implementierung: Welche Fallstricke, Hinweise oder Techniken sollten Sie bei der Implementierung des Musters kennen? Gibt es sprachspezifische Probleme?   <\/li>\n\n\n\n<li>Beispielcode: Fragmente, die veranschaulichen, wie Sie das Muster in C++ oder Smalltalk implementieren k\u00f6nnten.<\/li>\n\n\n\n<li>Bekannte Verwendungen: Beispiele f\u00fcr das Muster, die in realen Systemen zu finden sind. Wir f\u00fcgen mindestens zwei Beispiele aus verschiedenen Bereichen hinzu.   <\/li>\n\n\n\n<li>Verwandte Muster: Welche Entwurfsmuster sind eng mit diesem Muster verwandt? Was sind die wesentlichen Unterschiede? Welche anderen Muster sollten verwendet werden?    <\/li>\n<\/ul>\n\n<p><strong>Wie Design Patterns Designprobleme l\u00f6sen<\/strong><\/p>\n\n<p>Entwurfsmuster l\u00f6sen Entwurfsprobleme, indem sie geeignete Objekte finden. Entwurfsmuster helfen Ihnen, weniger offensichtliche Abstraktionen und die Objekte zu identifizieren, die sie erfassen k\u00f6nnen. Design Patterns bestimmen auch die Granularit\u00e4t von Objekten. Design Patterns beschreiben, wie Sie komplette Subsysteme als Objekte darstellen und eine gro\u00dfe Anzahl von Objekten mit feinster Granularit\u00e4t unterst\u00fctzen k\u00f6nnen. Entwurfsmuster helfen Ihnen bei der Definition von Schnittstellen, indem sie deren wesentliche Elemente und die Arten von Daten, die \u00fcber eine Schnittstelle gesendet werden, identifizieren. Ein Entwurfsmuster kann Ihnen auch sagen, was Sie nicht in die Schnittstelle aufnehmen sollten.   <\/p>\n\n<p><strong><em>Lieblingszitat des Kapitels: &#8222;Sch\u00f6pferische Klassenmuster verschieben einen Teil der Objekterstellung auf Unterklassen, w\u00e4hrend Sch\u00f6pferische Objektmuster sie auf ein anderes Objekt verschieben. Die strukturellen Klassenmuster verwenden die Vererbung, um Klassen zusammenzustellen, w\u00e4hrend die strukturellen Objektmuster Wege beschreiben, um Objekte zusammenzusetzen. Die Verhaltensklassenmuster verwenden die Vererbung, um Algorithmen und den Kontrollfluss zu beschreiben, w\u00e4hrend die Verhaltensobjektmuster beschreiben, wie eine Gruppe von Objekten zusammenarbeitet, um eine Aufgabe zu erf\u00fcllen, die kein einzelnes Objekt ausf\u00fchren kann.  <\/em><\/strong><\/p>\n\n<p><strong><em>allein.&#8220;<\/em><\/strong><\/p>\n\n<p><strong>Kapitel zwei: Eine Fallstudie: Entwurf eines Dokument-Editors<\/strong><\/p>\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-sam-j-1764956-1024x576.jpg\" alt=\"\" class=\"wp-image-17508\" width=\"463\" height=\"260\" srcset=\"https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-sam-j-1764956-1024x576.jpg 1024w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-sam-j-1764956-300x169.jpg 300w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-sam-j-1764956-768x432.jpg 768w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-sam-j-1764956-1536x864.jpg 1536w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-sam-j-1764956.jpg 1680w\" sizes=\"(max-width: 463px) 100vw, 463px\" \/><\/figure>\n\n<p><strong>Struktur des Dokuments<\/strong><\/p>\n\n<p>In einem Dokument werden wesentliche grafische Elemente wie Zeichen, Linien, Polygone und andere Formen angeordnet. Diese Elemente enthalten den gesamten Informationsgehalt des Dokuments. Diese Elemente werden jedoch nicht als grafische Elemente betrachtet, sondern als die physische Struktur des Dokuments &#8211; Zeilen, Spalten, Abbildungen, Tabellen und andere Unterstrukturen. Diese Unterstrukturen wiederum haben ihre Unterstrukturen und so weiter. Die Benutzeroberfl\u00e4che von Lexi sollte es dem Benutzer erm\u00f6glichen, diese Unterstrukturen direkt zu manipulieren. Zum Beispiel sollte ein Benutzer ein Diagramm als Einheit behandeln k\u00f6nnen und nicht als eine Sammlung einzelner grafischer Primitive. Der Benutzer sollte in der Lage sein, sich auf eine Tabelle als Ganzes zu beziehen und nicht als eine formlose Masse von Text und Grafiken. Dies tr\u00e4gt dazu bei, die Benutzeroberfl\u00e4che einfach und intuitiv zu gestalten.       <\/p>\n\n<p><strong>Formatieren<\/strong><\/p>\n\n<p>Nachdem Sie einen Weg gefunden haben, die physische Struktur des Dokuments darzustellen, m\u00fcssen Sie herausfinden, wie Sie eine bestimmte physische Struktur konstruieren k\u00f6nnen. Eine, die einem richtig formatierten Dokument entspricht. Darstellung und Formatierung sind nicht dasselbe: Die F\u00e4higkeit, die physische Struktur des Dokuments zu erfassen, sagt uns nicht, wie wir zu einem bestimmten System kommen. Diese Verantwortung liegt in erster Linie bei Lexi.   <\/p>\n\n<p><strong>Den Formatierungsalgorithmus kapseln:<\/strong> Mit all seinen Einschr\u00e4nkungen und Details ist der Formatierungsprozess nicht einfach zu automatisieren. Es gibt viele Ans\u00e4tze f\u00fcr dieses Problem, und die Menschen haben verschiedene Formatierungsalgorithmen mit unterschiedlichen St\u00e4rken und Schw\u00e4chen entwickelt. Da es sich bei Lexi um einen What You See Is What You Get-Editor handelt, ist ein notwendiger Kompromiss die Balance zwischen Formatierungsqualit\u00e4t und Formatierungsgeschwindigkeit. Da Formatierungsalgorithmen in der Regel komplex sind, ist es w\u00fcnschenswert, dass sie in sich geschlossen oder &#8211; noch besser &#8211; v\u00f6llig unabh\u00e4ngig von der Dokumentstruktur sind. Im Idealfall k\u00f6nnten wir eine neue Art von Glyph-Unterklasse ohne R\u00fccksicht auf den Formatierungsalgorithmus hinzuf\u00fcgen. Umgekehrt sollte das Hinzuf\u00fcgen eines neuen Formatierungsalgorithmus keine \u00c4nderung der bestehenden Glyphen erfordern.     <\/p>\n\n<p><strong>Strategie-Muster:<\/strong> Die Kapselung eines Algorithmus in einem Objekt ist der Zweck des Strategy-Musters. Die wichtigsten Teilnehmer des Musters sind Strategy-Objekte, die verschiedene Algorithmen und den Kontext, in dem sie arbeiten, kapseln. Compositors sind Strategien; sie kapseln verschiedene Formatierungsalgorithmen. Die Komposition ist der Kontext f\u00fcr eine Compositor-Strategie. Der Schl\u00fcssel zur Anwendung des Strategiemusters ist der Entwurf von Schnittstellen f\u00fcr das System und seinen Kontext, die allgemein genug sind, um eine Reihe von Algorithmen zu unterst\u00fctzen.    <\/p>\n\n<p><strong>Versch\u00f6nern der Benutzeroberfl\u00e4che<\/strong><\/p>\n\n<p>Betrachten Sie zwei Versch\u00f6nerungen in der Benutzeroberfl\u00e4che von Lexi. Die erste f\u00fcgt einen Rahmen um den Textbearbeitungsbereich hinzu, um die Textseite abzugrenzen. Die zweite f\u00fcgt Bildlaufleisten hinzu, mit denen der Benutzer verschiedene Seitenteile anzeigen kann. Um das Hinzuf\u00fcgen und Entfernen dieser Verzierungen zu vereinfachen (insbesondere zur Laufzeit), sollten Sie sie nicht durch Vererbung zur Benutzeroberfl\u00e4che hinzuf\u00fcgen. Die gr\u00f6\u00dfte Flexibilit\u00e4t erreichen wir, wenn andere Objekte der Benutzeroberfl\u00e4che nicht einmal wissen, dass die Verzierungen vorhanden sind. So k\u00f6nnen wir die Versch\u00f6nerungen hinzuf\u00fcgen und entfernen, ohne andere Klassen zu \u00e4ndern.     <\/p>\n\n<p>Aus der Sicht der Programmierung bedeutet die Versch\u00f6nerung der Benutzeroberfl\u00e4che eine Erweiterung des vorhandenen Codes. Die Verwendung von Vererbung f\u00fcr solche Erweiterungen verhindert, dass Versch\u00f6nerungen zur Laufzeit neu angeordnet werden. Ein ebenso ernstes Problem ist jedoch die Explosion von Klassen, die sich aus einem vererbungsbasierten Ansatz ergibt. <\/p>\n\n<p><strong>Decorator-Muster:<\/strong> Das Decorator (196)-Muster erfasst Klassen- und Objektbeziehungen, die eine Versch\u00f6nerung durch transparente Einschl\u00fcsse unterst\u00fctzen. Der Begriff &#8222;Versch\u00f6nerung&#8220; hat eine breitere Bedeutung als die, die wir hier betrachtet haben. Im Decorator-Muster bezieht sich &#8222;Versch\u00f6nerung&#8220; auf alles, was einem Objekt zus\u00e4tzliche Verantwortlichkeiten verleiht.  <\/p>\n\n<p><strong><em>Lieblingszitat: &#8222;Die Wahl der internen Darstellung des Dokuments beeinflusst fast jeden Aspekt des Designs von Lexi.&#8220;<\/em><\/strong><\/p>\n\n<p><strong>Kapitel drei: Sch\u00f6pferische Muster<\/strong><\/p>\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-scott-webb-430207-1024x683.jpg\" alt=\"\" class=\"wp-image-17504\" width=\"462\" height=\"308\" srcset=\"https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-scott-webb-430207-1024x683.jpg 1024w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-scott-webb-430207-300x200.jpg 300w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-scott-webb-430207-768x512.jpg 768w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-scott-webb-430207-1536x1024.jpg 1536w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-scott-webb-430207-2048x1366.jpg 2048w\" sizes=\"(max-width: 462px) 100vw, 462px\" \/><\/figure>\n\n<p>Kreative Entwurfsmuster abstrahieren den Instanziierungsprozess. Sie helfen dabei, ein System unabh\u00e4ngig davon zu machen, wie seine Objekte erstellt, zusammengesetzt und dargestellt werden. Ein Muster zur Erstellung von Klassen verwendet die Vererbung, um die instanziierte Klasse zu variieren, w\u00e4hrend ein Muster zur Erstellung von Objekten die Instanziierung an ein anderes Objekt delegiert.  <\/p>\n\n<p>Sch\u00f6pfungsmuster werden wichtig, wenn Systeme mehr von der Komposition von Objekten als von der Vererbung von Klassen abh\u00e4ngen. In diesem Fall verlagert sich der Schwerpunkt von der Hardcodierung einer festen Reihe von Verhaltensweisen auf die Definition einer kleineren Gruppe grundlegender Verhaltensweisen, die aus komplexeren Verhaltensweisen zusammengesetzt werden k\u00f6nnen. Die Erstellung von Objekten mit bestimmten Verhaltensweisen erfordert also mehr als nur die Instanziierung einer Klasse.  <\/p>\n\n<p>Bei diesen Mustern gibt es zwei Gemeinsamkeiten. Erstens kapseln sie alle das Wissen dar\u00fcber, welche konkreten Klassen das System verwendet. Zweitens verbergen sie, wie Instanzen dieser Klassen erstellt und zusammengesetzt werden. Alles, was das System insgesamt \u00fcber die Objekte wei\u00df, sind ihre Schnittstellen, die durch abstrakte Klassen definiert sind. Kreative Muster k\u00f6nnen manchmal Konkurrenten sein. Das hei\u00dft, dass es F\u00e4lle gibt, in denen entweder Prototype oder Abstract Factory gewinnbringend eingesetzt werden k\u00f6nnen. In anderen F\u00e4llen sind sie komplement\u00e4r: Der Builder kann eines der verschiedenen Muster verwenden, um festzulegen, welche Komponenten gebaut werden. Der Prototyp kann Singleton f\u00fcr seine Implementierung verwenden. Kreative Muster umfassen;        <\/p>\n\n<p><strong>Abstrakte Fabrik:<\/strong> Bietet eine Schnittstelle f\u00fcr die Erstellung von Familien verwandter oder abh\u00e4ngiger Objekte, ohne dass deren konkrete Klassen angegeben werden m\u00fcssen.<\/p>\n\n<p>Builder: Trennen Sie die Konstruktion eines komplexen Objekts von seiner Darstellung, damit derselbe Konstruktionsprozess verschiedene Ausdr\u00fccke erzeugen kann.<\/p>\n\n<p><strong>Fabrik-Methode:<\/strong> Definieren Sie eine Schnittstelle zur Erstellung eines Objekts, aber lassen Sie Unterklassen entscheiden, welche Klasse instanziiert werden soll. Die Factory-Methode erm\u00f6glicht es einer Klasse, die Instanziierung auf Unterklassen zu verschieben. <\/p>\n\n<p><strong>Prototyp:<\/strong> Legen Sie die Arten von Objekten fest, die mit einer prototypischen Instanz erstellt werden sollen, und erstellen Sie neue Dinge, indem Sie diesen Prototyp kopieren.<\/p>\n\n<p><strong>Singleton:<\/strong> Stellen Sie sicher, dass eine Klasse nur eine Instanz hat und bieten Sie einen globalen Zugangspunkt zu dieser Klasse.<\/p>\n\n<p><strong><em>Lieblingszitat des Kapitels: &#8222;Es gibt zwei wiederkehrende Themen in diesen Mustern. Erstens kapseln sie alle das Wissen dar\u00fcber, welche konkreten Klassen das System verwendet. Zweitens verbergen sie, wie Instanzen dieser Klassen erstellt und zusammengesetzt werden.&#8220;<\/em><\/strong><\/p>\n\n<p><strong>Kapitel vier: Strukturelle Muster<\/strong><\/p>\n\n<p>Strukturelle Muster befassen sich damit, wie Klassen und Objekte zusammengesetzt werden, um gr\u00f6\u00dfere Strukturen zu bilden. Strukturelle Klassenmuster verwenden Vererbung, um Schnittstellen oder Implementierungen zu sammeln. Betrachten Sie als einfaches Beispiel, wie  <\/p>\n\n<p>Multiple Estates mischen zwei oder mehr Klassen zu einer. Das Ergebnis ist eine Klasse, die die Eigenschaften ihrer Elternklassen kombiniert. Dieses Muster ist praktisch, um unabh\u00e4ngig voneinander entwickelte Klassenbibliotheken zusammenarbeiten zu lassen. Ein weiteres Beispiel ist die Klassenform des Adaptermusters. Im Allgemeinen sorgt ein Adapter daf\u00fcr, dass eine Schnittstelle an eine andere angepasst wird, und bietet eine einheitliche Abstraktion verschiedener Schnittstellen. Ein Klassenadapter erreicht dies, indem er privat von einer Adaptee-Klasse erbt. Der Adapter dr\u00fcckt dann seine Schnittstelle in Form der Adaptees aus. Strukturelle Objektmuster beschreiben M\u00f6glichkeiten, Objekte zu komponieren, um neue Funktionen zu realisieren. Die zus\u00e4tzliche Flexibilit\u00e4t der Objektkomposition ergibt sich aus der M\u00f6glichkeit, das Dokument w\u00e4hrend der Laufzeit zu \u00e4ndern, was bei der statischen Klassenkomposition nicht m\u00f6glich ist. Ein strukturelles Objektmuster beschreibt den Aufbau einer Klassenhierarchie von Klassen f\u00fcr zwei Arten von Objekten: primitive und zusammengesetzte. Mit den zusammengesetzten Objekten k\u00f6nnen Sie primitive und andere zusammengesetzte Objekte zu beliebig komplexen Strukturen zusammensetzen. Im Folgenden finden Sie die strukturellen Muster, die Sie kennen sollten;           <\/p>\n\n<p><strong>Adapter:<\/strong> Konvertieren Sie die Schnittstelle einer Klasse in eine andere Schnittstelle, die Kunden erwarten. Mit dem Adapter k\u00f6nnen Klassen zusammenarbeiten, die sonst aufgrund inkompatibler Schnittstellen nicht zusammenarbeiten k\u00f6nnten.   <\/p>\n\n<p><strong>Br\u00fccke:<\/strong> Entkoppeln Sie eine Abstraktion von ihrer Implementierung, so dass beide unabh\u00e4ngig voneinander variieren k\u00f6nnen.<\/p>\n\n<p><strong>Zusammengesetzt:<\/strong> Setzen Sie Objekte in Baumstrukturen zusammen, um Teil-Ganzes-Hierarchien darzustellen. Mit Composite k\u00f6nnen Clients einzelne Objekte und Kompositionen von Objekten einheitlich behandeln. <\/p>\n\n<p>Dekorateur: F\u00fcgen Sie einem Objekt dynamisch zus\u00e4tzliche Verantwortlichkeiten hinzu. Decorators bieten eine flexible Alternative zur Unterklassifizierung f\u00fcr die Erweiterung von Funktionen. <\/p>\n\n<p><strong>Fassade:<\/strong> Bietet eine einheitliche Schnittstelle zu einer Reihe von Schnittstellen in einem Subsystem. Eine Fassade definiert eine \u00fcbergeordnete Schnittstelle, die die Verwendung des Subsystems erleichtert. <\/p>\n\n<p><strong>Fliegengewicht:<\/strong> Nutzen Sie die gemeinsame Nutzung, um eine gro\u00dfe Anzahl von feink\u00f6rnigen Objekten effizient zu unterst\u00fctzen.<\/p>\n\n<p><strong>Proxy:<\/strong> Stellen Sie ein Surrogat oder einen Platzhalter f\u00fcr ein anderes Objekt bereit, um den Zugriff auf dieses Objekt zu kontrollieren.<\/p>\n\n<p><strong>\n  <em>Bevorzugtes Zitat: &#8222;Anstatt Schnittstellen oder Implementierungen zu komponieren, beschreiben strukturelle Objektmuster Wege, Objekte zu komponieren, um neue Funktionen zu realisieren<\/em>\n<\/strong>.&#8220;<\/p>\n\n<p><strong>Kapitel f\u00fcnf: Verhaltensmuster<\/strong><\/p>\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-karolina-grabowska-4466208-1024x716.jpg\" alt=\"\" class=\"wp-image-17517\" width=\"462\" height=\"323\" srcset=\"https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-karolina-grabowska-4466208-1024x716.jpg 1024w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-karolina-grabowska-4466208-300x210.jpg 300w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-karolina-grabowska-4466208-768x537.jpg 768w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-karolina-grabowska-4466208-1536x1075.jpg 1536w, https:\/\/devologyx.io\/wp-content\/uploads\/2023\/07\/pexels-karolina-grabowska-4466208.jpg 1761w\" sizes=\"(max-width: 462px) 100vw, 462px\" \/><\/figure>\n\n<p>Bei Verhaltensmustern geht es um Algorithmen und die Zuweisung von Verantwortlichkeiten zwischen Objekten.<\/p>\n\n<p>Verhaltensmuster beschreiben nicht nur Muster von Objekten oder Klassen, sondern auch die Kommunikationsmuster zwischen ihnen. Diese Muster charakterisieren komplexe Kontrollfl\u00fcsse, die zur Laufzeit nur schwer zu verfolgen sind. Sie verlagern Ihren Fokus weg vom Kontrollfluss, damit Sie sich darauf konzentrieren k\u00f6nnen, wie die Objekte miteinander verbunden sind. Verhaltensmuster f\u00fcr Klassen verwenden Vererbung, um das Verhalten zwischen Klassen zu verteilen. Dieses Kapitel enth\u00e4lt zwei solcher Muster. Template Method (360) ist das einfachere und h\u00e4ufigere der beiden Muster. Eine Schablonenmethode ist eine abstrakte Definition eines Algorithmus. Sie definiert den Algorithmus Schritt f\u00fcr Schritt. Jeder Schritt ruft entweder eine abstrakte Operation oder eine primitive Operation auf. Eine Unterklasse konkretisiert den Algorithmus durch die Definition der abstrakten Operationen. Das andere verhaltensorientierte Klassenmuster ist Interpreter (274), das die Grammatik als eine Klassenhierarchie darstellt und einen Interpreter als Operation auf Instanzen dieser Klassen implementiert. Behavioural Object Patterns verwenden Objektkomposition anstelle von Vererbung. Einige beschreiben, wie eine Gruppe von Peer-Objekten zusammenarbeitet, um eine Aufgabe zu erf\u00fcllen, die kein einzelnes Objekt ausf\u00fchren kann. Ein wichtiger Punkt dabei ist, wie die Peer-Objekte voneinander wissen. Peers k\u00f6nnten explizite Referenzen zueinander unterhalten, was ihre Kopplung erh\u00f6ht. Im Extremfall w\u00fcrde jedes Objekt \u00fcber jedes andere Bescheid wissen. Das Mediator (305)-Muster vermeidet dies, indem es ein Mediator-Objekt zwischen den Peers einf\u00fchrt. Der Mediator sorgt f\u00fcr die Umleitung, die f\u00fcr eine lose Kopplung erforderlich ist. Dies sind einige der Verhaltensmuster;                  <\/p>\n\n<p>Interpreter: Definieren Sie f\u00fcr eine Sprache eine Darstellung ihrer Grammatik und einen Interpreter, der diese Darstellung verwendet, um S\u00e4tze in der Sprache zu interpretieren.<\/p>\n\n<p><strong>Befehl:<\/strong> Kapseln Sie eine Anfrage als Objekt, so dass Sie Clients mit verschiedenen Anfragen parametrisieren, Anfragen in eine Warteschlange stellen oder protokollieren und r\u00fcckg\u00e4ngig machbare Operationen unterst\u00fctzen k\u00f6nnen.<\/p>\n\n<p><strong>Iterator:<\/strong> Bietet eine M\u00f6glichkeit, auf die Elemente eines Aggregatobjekts sequentiell zuzugreifen, ohne die zugrunde liegende Darstellung offenzulegen.<\/p>\n\n<p>Vermittler: Definieren Sie ein Objekt, das kapselt, wie eine Gruppe von Objekten interagiert. Mediator f\u00f6rdert die lose Kopplung, indem er verhindert, dass Objekte explizit aufeinander verweisen und Sie ihre Interaktion unabh\u00e4ngig voneinander variieren k\u00f6nnen.   <\/p>\n\n<p><strong>Memento:<\/strong> Erfassen und externalisieren Sie den internen Zustand eines Objekts, ohne die Kapselung zu verletzen, damit das Objekt sp\u00e4ter wieder in diesen Zustand versetzt werden kann.<\/p>\n\n<p>Beobachter: Definieren Sie eine eins-zu-viele-Abh\u00e4ngigkeit zwischen Objekten, so dass bei einer Zustands\u00e4nderung eines Objekts alle abh\u00e4ngigen Objekte benachrichtigt und automatisch aktualisiert werden.<\/p>\n\n<p><strong>Zustand:<\/strong> Erlauben Sie einem Objekt, sein Verhalten zu \u00e4ndern, wenn sich sein interner Zustand \u00e4ndert. Das Objekt scheint seine Klasse zu \u00e4ndern.   <\/p>\n\n<p><strong>Strategie:<\/strong> Definieren Sie eine Familie von Algorithmen, kapseln Sie jeden einzelnen und machen Sie sie austauschbar. Die Strategie l\u00e4sst den Algorithmus unabh\u00e4ngig von den Clients, die ihn verwenden, variieren. <\/p>\n\n<p><strong><em>Der Favorit des Kapitels: Ein wichtiges Thema ist die Frage, wie Peer-Objekte voneinander wissen.&#8220;<\/em><\/strong><\/p>\n\n<p><strong>WIE DIESES BUCH SOFTWAREENTWICKLERN HELFEN KANN<\/strong><\/p>\n\n<p>Das Buch &#8222;Design Patterns: Elements of Reusable Object-Oriented Software&#8220; von Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides ist ein bahnbrechendes Werk in der Softwaretechnik, das 23 Entwurfsmuster f\u00fcr die objektorientierte Programmierung beschreibt. ist ein Buch, das Softwareentwicklern helfen kann, indem es ihnen wiederverwendbare L\u00f6sungen f\u00fcr h\u00e4ufige Entwurfsprobleme bei der objektorientierten Softwareentwicklung bietet. Diese Muster l\u00f6sen g\u00e4ngige Designprobleme und f\u00f6rdern flexiblen, wiederverwendbaren und wartbaren Code. Wenn Softwareentwickler diese Muster verstehen und anwenden, k\u00f6nnen sie effizienteren, modularen und erweiterbaren Code schreiben, der leichter zu verstehen, zu \u00e4ndern und zu pflegen ist.   <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kapitel Eins: Einleitung Die Entwicklung von objektorientierter Software ist komplex, und wiederverwendbare objektorientierte Software ist sogar noch anspruchsvoller. Sie m\u00fcssen relevante Objekte finden, sie mit der richtigen Granularit\u00e4t in Klassen einteilen, Klassenschnittstellen und Vererbungshierarchien definieren und wichtige Beziehungen zwischen ihnen herstellen. Ihr Entwurf sollte spezifisch f\u00fcr das Problem und allgemein genug sein, um zuk\u00fcnftige Probleme [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":17498,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"_jet_sm_ready_style":"","_jet_sm_style":"","_jet_sm_controls_values":"","_jet_sm_fonts_collection":"","_jet_sm_fonts_links":"","footnotes":""},"categories":[83],"tags":[],"writer":[],"class_list":["post-19929","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-buchclub"],"_links":{"self":[{"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/posts\/19929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/comments?post=19929"}],"version-history":[{"count":1,"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/posts\/19929\/revisions"}],"predecessor-version":[{"id":19932,"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/posts\/19929\/revisions\/19932"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/media\/17498"}],"wp:attachment":[{"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/media?parent=19929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/categories?post=19929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/tags?post=19929"},{"taxonomy":"writer","embeddable":true,"href":"https:\/\/devologyx.io\/de\/wp-json\/wp\/v2\/writer?post=19929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}