Verständnis Decorator Design Pattern in C#
Ich habe gerade angefangen zu lernen Decorator Design Pattern, leider musste ich gehen durch verschiedene refrences zu verstehen, das Dekorator-Muster in einer besseren Art und Weise führte mich in große Verwirrung. also, so weit wie mein Verständnis, das ist Sorge, ich glaube, das ist eine decorator-Muster
interface IComponent
{
void Operation();
}
class Component : IComponent
{
public void Operation()
{
Console.WriteLine("I am walking ");
}
}
class DecoratorA : IComponent
{
IComponent component;
public DecoratorA(IComponent c)
{
component = c;
}
public void Operation()
{
component.Operation();
Console.WriteLine("in the rain");
}
}
class DecoratorB : IComponent
{
IComponent component;
public DecoratorB(IComponent c)
{
component = c;
}
public void Operation()
{
component.Operation();
Console.WriteLine("with an umbrella");
}
}
class Client
{
static void Main()
{
IComponent component = new Component();
component.Operation();
DecoratorA decoratorA = new DecoratorA(new Component());
component.Operation();
DecoratorB decoratorB = new DecoratorB(new Component());
component.Operation();
Console.Read();
}
}
kann aber den code unten auch Dekorator-Muster?
class Photo
{
public void Draw()
{
Console.WriteLine("draw a photo");
}
}
class BorderedPhoto : Photo
{
public void drawBorder()
{
Console.WriteLine("draw a border photo");
}
}
class FramePhoto : BorderedPhoto
{
public void frame()
{
Console.WriteLine("frame the photo");
}
}
class Client
{
static void Main()
{
Photo p = new Photo();
p.Draw();
BorderedPhoto b = new BorderedPhoto();
b.Draw();
b.drawBorder();
FramePhoto f = new FramePhoto();
f.Draw();
f.drawBorder();
f.frame();
}
}
Mein Verständnis
aus dem zweiten Beispiel von mir, nennen wir Sie alle drei Methoden, aber aus dem ersten Beispiel, das ich nicht in der Lage, Zugang zu allen drei Methoden erstellen ein einzelnes Objekt.
- 1 - Dekorator, 2 - nicht. Von meinem Standpunkt aus, Dekorateur sollten wrap eingerichtet Objekt 🙂
- decorator wird angenommen, zu verlängern, die Methoden, richtig!!!!!. warum dann das zweite ist nicht ein Dekorator-Muster? Könnten Sie mir helfen zu verstehen?
- Ich würde sagen, es ist da ein decorator schmückt eine vorhandene Instanz. Wenn ich bereits eine Instanz von
Photo
, ich kann nicht einfach dekorieren Sie es mitBorderedPhoto
, würde ich erstellen Sie eine Instanz vonBorderedPhoto
und kopieren Sie dann Eigenschaften aus meiner ursprünglichenPhoto
Instanz. Das ist nicht die Dekoration. - Wenn du gehen Sie hier [sourcemaking.com/design_patterns], Lesen Sie die "Kritik" - Abschnitt. Insbesondere Unter idealen factoring, ein Konzept, das nicht kopiert, sondern lediglich referenziert. Aber wenn etwas ist, referenziert und nicht kopiert, dann gibt es keine "Muster" zu label und Katalog.. . . .Sagen wir ich habe eine Klasse A.
class A { public A (B contained){} }
. . .undA
aussetzen veränderte Verhalten vonB
. Es ist auch Dekorateur. Nein, kein proxy. Proxy erstellen müssenclass B
in sich selbst per definition. So, mein Punkt ist, die Muster, die Sie Lesen, über klassische Implementierungen, aber fühlen Sie sich frei, Sie zu interpretieren. - vielen Dank für die explanantion 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte es ein Kommentar werden, aber ich habe zu viele Worte.
Zum Beispiel, Sie haben ein Objekt und interface, wie
Repository : IRepository
.und client, die wohl von einer anderen Person geschrieben
Und sobald Sie beschlossen, dass ALLE Anrufe in einem repository protokolliert werden sollen. Aber Sie haben ein problem: die
Repository
Klasse aus einer externen Bibliothek, und Sie wollen nicht, um das zu ändern code. So benötigen Sie zum erweitern derRepository
's Verhalten, das Sie verwenden. Schreiben SieRepositoryLogDecorator : IRepository
, und innen auf jede Methode zu tun, die Protokollierung, wieAlso, bevor Sie verwenden könnte-client als
aber jetzt können Sie
Beachten Sie, dass dieses ein sehr einfaches Beispiel. In realen Projekten, wo ein Objekt erstellt primär mit DI-Containern, werden Sie in der Lage sein zu verwenden, Dekorateur, indem Sie einige config.
So, Dekorator wird verwendet, um die Erweiterung der Funktionalität des Objektes ohne ändern der Objekt-oder client.
Ein weiterer Vorteil des Dekorators: der Dekorator wird, hängt nicht von
Repository
Umsetzung. Hängt nur von einer SchnittstelleIRepository
. Warum ist das ein Vorteil? Wenn irgendwie Sie sich entscheiden, zu schreiben, Sie eigene Implementierung vonIRepository
werden Sie in der Lage, automatisch dekorieren Sie diese mit decorator, die bereits existieren
Sehen wollen Beispiel von real software? (nur als Beispiel, der code ist hässlich, ich weiß) => gehen Sie hier
Gibt es diese PatternCraft Serie auf Youtube erklärt, dass Design Patterns mit Starcraft, sollten Sie schauen Sie sich ein video über Dekoratoren hier.
In dem video oben der Autor gibt ein Beispiel mit einem
Marine
undWeaponUpgrade
.Im Spiel haben Sie eine
Marine
und dann können Sie ein upgrade Ihrer Waffe:Beachten Sie, dass Sie noch eine marine gibt, ist es nicht eine neue Einheit, es ist die gleiche Einheit mit den Dingen, die ändert seine Attribute.
Dies tun Sie, indem Sie eine Klasse erstellen, die die gleichen Schnittstellen, wie Sie Ihr Gerät und den Zugriff auf Ihr Gerät-Eigenschaften Werte ändern.
Es ist ein Kata auf CodeWars anspruchsvolle Sie zum abschließen der Waffe und Rüstung Dekorateure für einen marine.
Pro Der GOF-Seite Decorator Design pattern:
In Ihrem zweiten Beispiel Sie sind mit der Vererbung zu erweitern, das Verhalten einer Klasse, ich glaube, dies ist technisch nicht eine Decorator-design-pattern.
Dem decorator-pattern ermöglicht das hinzufügen von einem bestimmten Verhalten auf ein einzelne Objekt von einem bestimmten Typ ohne Auswirkungen auf die anderen Instanzen des gleichen Typs.
In Ihrem zweiten Beispiel, die normale Vererbung, alle Instanzen von der Klasse Erben, das geänderte Verhalten.
Das zweite Beispiel ist nicht ein Muster schmücken, da ein wesentlicher Bestandteil, um die Dekorator-Muster ist, dass das Objekt akzeptiert einen von seiner Art und vielleicht auch verbessern.
Einen Instanzen dieser im ersten Beispiel ist
public DecoratorA(IComponent c)
{
component = c;
}
Auch, das Ziel, das Dekorator-Muster ist die Schaffung von "ein" Objekt, dann dekorieren Sie es, indem Sie es durch verschiedene Filter oder Dekorateure.
Damit die Linie
DecoratorA decoratorA = new DecoratorA(new Component());
Sollte
DecoratorA decoratorA = new DecoratorA(component );