Ich habe das Dekorationsmuster studiert, wie es in GOF dokumentiert ist .
Bitte helfen Sie mir, das Dekorationsmuster zu verstehen . Könnte jemand ein Anwendungsbeispiel geben, wo dies in der realen Welt nützlich ist?
decorator
design-patterns
odiseh
quelle
quelle
Antworten:
Stellen Sie sich einen Pizzaladen vor. In der Pizzeria werden sie nur wenige Pizzasorten verkaufen und sie werden auch Beläge auf der Speisekarte anbieten. Stellen Sie sich nun eine Situation vor, in der die Pizzeria Preise für jede Kombination aus Pizza und Belag angeben muss. Selbst wenn es vier einfache Pizzen und acht verschiedene Beläge gibt, würde die Anwendung verrückt werden, wenn all diese konkreten Kombinationen von Pizzen und Belägen beibehalten würden.
Hier kommt das Dekorationsmuster.
Gemäß dem Dekorationsmuster implementieren Sie Beläge, da Dekorateure und Pizzen von den Dekorateuren dieser Beläge dekoriert werden. Praktisch jeder Kunde möchte Beläge nach seinem Wunsch und der endgültige Rechnungsbetrag setzt sich aus den Basispizzas und zusätzlich bestellten Belägen zusammen. Jeder Dekorateur würde über die Pizzen, die er dekoriert, und den Preis Bescheid wissen. Die GetPrice () -Methode des Topping-Objekts gibt den kumulierten Preis sowohl für die Pizza als auch für das Topping zurück.
BEARBEITEN
Hier ist ein Codebeispiel zur Erklärung oben.
quelle
Dies ist ein einfaches Beispiel für das dynamische Hinzufügen eines neuen Verhaltens zu einem vorhandenen Objekt oder des Decorator-Musters. Aufgrund der Natur dynamischer Sprachen wie Javascript wird dieses Muster Teil der Sprache selbst.
quelle
switch
oder eines einfachenif
Modells behaupten, dass dies ein großartiges Beispiel für das dynamische Hinzufügen von Verhalten zu einer Klasse ist. ABER wir benötigen mindestens zwei Klassen, um einen Dekorateur und dekorierte Objekte in diesem Muster zu definieren.Es ist erwähnenswert, dass das Java-E / A-Modell auf dem Dekorationsmuster basiert. Die Überlagerung dieses Lesers mit diesem Leser über ... ist ein wirklich reales Beispiel für Dekorateur.
quelle
Beispiel - Szenario - Angenommen, Sie schreiben ein Verschlüsselungsmodul. Diese Verschlüsselung kann die gelöschte Datei mit DES - Data Encryption Standard verschlüsseln. Ebenso können Sie in einem System die Verschlüsselung als AES - Advance-Verschlüsselungsstandard verwenden. Sie können auch die Kombination von Verschlüsselung verwenden - zuerst DES, dann AES. Oder Sie können zuerst AES, dann DES haben.
Diskussion - Wie werden Sie mit dieser Situation umgehen? Sie können das Objekt solcher Kombinationen nicht weiter erstellen - zum Beispiel - AES und DES - insgesamt 4 Kombinationen. Sie benötigen also 4 einzelne Objekte. Dies wird komplex, wenn der Verschlüsselungstyp zunimmt.
Lösung - Bauen Sie die Stapelkombinationen je nach Bedarf zur Laufzeit weiter auf. Ein weiterer Vorteil dieses Stapelansatzes besteht darin, dass Sie ihn leicht abwickeln können.
Hier ist die Lösung - in C ++.
Erstens benötigen Sie eine Basisklasse - eine grundlegende Einheit des Stapels. Sie können als Basis des Stapels denken. In diesem Beispiel handelt es sich um eine klare Datei. Folgen wir immer dem Polymorphismus. Machen Sie zuerst eine Schnittstellenklasse dieser Grundeinheit. Auf diese Weise können Sie es nach Ihren Wünschen implementieren. Außerdem müssen Sie nicht an die Abhängigkeit denken, während Sie diese grundlegende Einheit einbeziehen.
Hier ist die Schnittstellenklasse -
Implementieren Sie nun diese Schnittstellenklasse -
Lassen Sie uns nun eine abstrakte Klasse für Dekorateure erstellen, die erweitert werden kann, um jede Art von Geschmacksrichtungen zu erstellen. Hier ist die Geschmacksrichtung der Verschlüsselungstyp. Diese abstrakte Klasse des Dekorateurs ist mit der Basisklasse verwandt. Somit ist der Dekorator eine Art Schnittstellenklasse. Daher müssen Sie die Vererbung verwenden.
Lassen Sie uns nun eine konkrete Dekorationsklasse erstellen - Verschlüsselungstyp - AES -
Angenommen, der Dekoratortyp ist DES -
const std :: string desEncrypt = "DES Encrypted";
Lassen Sie uns einen Client-Code erstellen, um diese Decorator-Klasse zu verwenden -
Sie sehen die folgenden Ergebnisse -
Hier ist das UML-Diagramm - Klassendarstellung davon. Falls Sie den Code überspringen und sich auf den Designaspekt konzentrieren möchten.
quelle
strategy pattern
?Mit dem Dekorationsmuster können Sie eine Funktionalität Ihres Objekts ändern oder konfigurieren, indem Sie sie mit anderen ähnlichen Unterklassen dieses Objekts verketten.
Das beste Beispiel wären die Klassen InputStream und OutputStream im Paket java.io.
quelle
Was ist Decorator Design Pattern in Java?
Die formale Definition des Decorator-Musters aus dem GoF-Buch (Design Patterns: Elements of Reusable Object-Oriented Software, 1995, Pearson Education, Inc., Veröffentlichung als Pearson Addison Wesley) besagt, dass Sie Folgendes können:
"Fügen Sie einem Objekt dynamisch zusätzliche Verantwortlichkeiten hinzu. Dekorateure bieten eine flexible Alternative zur Unterklasse, um die Funktionalität zu erweitern."
Nehmen wir an, wir haben eine Pizza und möchten sie mit Belägen wie Hühnchen-Masala, Zwiebel und Mozzarella-Käse dekorieren. Mal sehen, wie man es in Java implementiert ...
Programm zur Demonstration der Implementierung von Decorator Design Pattern in Java.
Pizza.java:
quelle
Ich habe bei meiner Arbeit ausgiebig Decorator-Muster verwendet. Ich habe in meinem Blog einen Beitrag darüber verfasst, wie man ihn mit der Protokollierung verwendet.
quelle
Nehmen wir ein Beispiel, in dem Sie eine App erstellen müssen, die den Preis für verschiedene Arten von Burgern berechnet. Sie müssen mit verschiedenen Burgervarianten umgehen, z. B. "groß" oder "mit Käse", von denen jeder einen Preis im Verhältnis zum Basisburger hat. ZB 10 USD für Burger mit Käse, 15 USD für großen Burger usw. hinzufügen
In diesem Fall könnten Sie versucht sein, Unterklassen zu erstellen, um diese zu behandeln. Wir könnten dies in Ruby ausdrücken als:
Im obigen Beispiel erbt die BurgerWithCheese-Klasse von Burger und überschreibt die Preismethode, um dem in der Superklasse definierten Preis 15 USD hinzuzufügen. Sie würden auch eine LargeBurger-Klasse erstellen und den Preis relativ zu Burger definieren. Sie müssen aber auch eine neue Klasse für die Kombination von "groß" und "mit Käse" definieren.
Was passiert nun, wenn wir "Burger mit Pommes" servieren müssen? Wir haben bereits 4 Klassen, um diese Kombinationen zu handhaben, und wir müssen 4 weitere hinzufügen, um alle Kombinationen der 3 Eigenschaften zu handhaben - "groß", "mit Käse" und "mit Pommes". Wir brauchen jetzt 8 Klassen. Fügen Sie eine weitere Eigenschaft hinzu und wir benötigen 16. Dies wird als 2 ^ n wachsen.
Versuchen wir stattdessen, einen BurgerDecorator zu definieren, der ein Burger-Objekt aufnimmt:
Im obigen Beispiel haben wir eine BurgerDecorator-Klasse erstellt, von der die BurgerWithCheese-Klasse erbt. Wir können die "große" Variante auch darstellen, indem wir die LargeBurger-Klasse erstellen. Jetzt könnten wir einen großen Burger mit Käse zur Laufzeit definieren als:
Erinnern Sie sich, wie die Verwendung der Vererbung zum Hinzufügen der Variante "mit Pommes" das Hinzufügen von 4 weiteren Unterklassen beinhalten würde? Mit Dekorateuren würden wir nur eine neue Klasse erstellen, BurgerWithFries, um die neue Variante zu handhaben und dies zur Laufzeit zu handhaben. Jede neue Eigenschaft würde nur mehr Dekorateur benötigen, um alle Permutationen abzudecken.
PS. Dies ist die Kurzversion eines Artikels, den ich über die Verwendung des Dekorationsmusters in Ruby geschrieben habe . Sie können ihn lesen, wenn Sie detailliertere Beispiele finden möchten.
quelle
Dekorateur:
Siehe Quellenherstellung Informationen finden Artikel .
Decorator (Abstract) : Dies ist eine abstrakte Klasse / Schnittstelle, die die Komponentenschnittstelle implementiert. Es enthält die Komponentenschnittstelle. In Abwesenheit dieser Klasse benötigen Sie viele Unterklassen von ConcreteDecorators für verschiedene Kombinationen. Die Zusammensetzung der Komponente reduziert unnötige Unterklassen.
JDK-Beispiel:
Schauen Sie sich die folgende SE-Frage für UML-Diagramme und Codebeispiele an.
Dekorationsmuster für E / A.
Nützliche Artikel:
journaldev
Wikipedia
Echtes Wortbeispiel für ein Dekorationsmuster: VendingMachineDecorator wurde erklärt @
Wann sollte das Dekorationsmuster verwendet werden?
Im obigen Beispiel wurde Tee oder Kaffee (Getränk) von Zucker und Zitrone dekoriert.
quelle
Das Dekorationsmuster erreicht ein einziges Ziel , jedem Objekt dynamisch Verantwortlichkeiten hinzuzufügen .
Das Java-E / A-Modell basiert auf einem Dekorationsmuster.
quelle
Auf Wikipedia gibt es ein Beispiel für die Dekoration eines Fensters mit Bildlaufleiste:
http://en.wikipedia.org/wiki/Decorator_pattern
Hier ist ein weiteres sehr "reales" Beispiel für "Teammitglied, Teamleiter und Manager", das zeigt, dass das Dekorationsmuster durch einfache Vererbung unersetzbar ist:
https://zishanbilal.wordpress.com/2011/04/28/design-patterns-by-examples-decorator-pattern/
quelle
Vor einiger Zeit hatte ich eine Codebasis in das Decorator-Muster umgestaltet, daher werde ich versuchen, den Anwendungsfall zu erklären.
Nehmen wir an, wir haben eine Reihe von Diensten und basierend darauf, ob der Benutzer die Lizenz für einen bestimmten Dienst erworben hat, müssen wir den Dienst starten.
Alle Dienste haben eine gemeinsame Schnittstelle
Pre Refactoring
Wenn Sie genau beobachten,
ServiceSupport
ist abhängig vonLicenseManager
. Aber warum sollte es abhängig seinLicenseManager
? Was wäre, wenn wir einen Hintergrunddienst benötigen, der die Lizenzinformationen nicht überprüfen muss? In der gegenwärtigen Situation müssen wir irgendwie trainieren,LicenseManager
um zurückzukehrentrue
für Hintergrunddienste zurückzukehren. Dieser Ansatz schien mir nicht gut zu sein. Meiner Meinung nach waren Lizenzprüfung und andere Logik orthogonal zueinander.Also kommt Decorator Pattern zur Rettung und hier beginnt das Refactoring mit TDD.
Nach dem Refactoring
Imbissbuden
quelle
Nehmen wir ein Beispiel für PubG. Sturmgewehre funktionieren am besten mit 4-fachem Zoom und während wir darauf sind, würden wir auch Kompensator und Suppressor benötigen. Es reduziert den Rückstoß und reduziert das Schussgeräusch sowie das Echo. Wir müssen diese Funktion implementieren, damit die Spieler ihre Lieblingswaffe und ihr Zubehör kaufen können. Spieler können die Waffe oder einen Teil des Zubehörs oder das gesamte Zubehör kaufen und werden entsprechend belastet.
Mal sehen, wie das Dekorationsmuster hier angewendet wird:
Angenommen, jemand möchte SCAR-L mit allen drei oben genannten Zubehörteilen kaufen.
Dies führt zu einem Klassendiagramm wie dem folgenden:
Jetzt können wir Klassen wie diese haben:
In ähnlicher Weise können wir auch anderes Zubehör hinzufügen und unsere Waffe dekorieren.
Referenz:
https://nulpointerexception.com/2019/05/05/a-beginner-guide-to-decorator-pattern/
quelle
Decorator Design Pattern : Dieses Muster hilft, die Eigenschaften eines Objekts zur Laufzeit zu ändern. Es bietet einem Objekt verschiedene Geschmacksrichtungen und gibt Flexibilität bei der Auswahl der Zutaten, die wir für diese Geschmacksrichtung verwenden möchten.
Beispiel aus dem wirklichen Leben: Nehmen wir an, Sie haben einen Hauptkabinensitz in einem Flug. Jetzt können Sie mit dem Sitz mehrere Annehmlichkeiten auswählen. Jede Annehmlichkeit hat ihre eigenen Kosten. Wenn sich ein Benutzer für Wifi und Premium-Essen entscheidet, wird ihm Sitzplatz + Wifi + Premium-Essen in Rechnung gestellt.
In diesem Fall kann uns das Dekorationsmuster wirklich helfen. Besuchen Sie den obigen Link, um mehr über das Dekorationsmuster und die Implementierung eines realen Beispiels zu erfahren.
quelle