📚
Lerndokumentationen
.NET
.NET
  • Willkommen
  • C#
    • Variablen
      • Strings
      • Integers
      • Floats und Doubles
      • Booleans
      • Casting und Parsing
    • Kontrollstrukturen
      • if-Statements
      • Ternary-Operator
      • Switch-Statements und -Expressions
    • Collections
      • Arrays
      • Lists
      • Dictionaries
    • Loops
      • while-Loops
      • for-Loops
      • foreach-Loops
      • continue und break
    • Methoden
      • Callbacks und Delegates
      • Extension Methods
      • Lazy
    • Objektorientierte Programmierung
      • Fields und Properties
      • Methoden
      • Statisch vs. Instanzen
      • Konstruktoren
      • Vererbung
      • Komposition
      • Generics
      • Tupel
    • Referenz- und Wertetypen
      • Enums
      • Structs
      • Records
    • Binary und Strings
      • Kodierung von Strings und Bytes
      • Streams
      • XML und JSON
  • Design Patterns
    • Creational Patterns
      • Singleton
    • Structural Patterns
      • Decorator Pattern
    • Behavioral Patterns
      • Memento
      • Strategy
Bereitgestellt von GitBook
Auf dieser Seite
  • Klassendiagramm
  • Implementierung
  • Beispiele
  • Klassendiagramme
  • Implementierung
  1. Design Patterns
  2. Structural Patterns

Decorator Pattern

VorherigeStructural PatternsNächsteBehavioral Patterns

Zuletzt aktualisiert vor 1 Monat

Decorator ist ein strukturelles Entwurfsmuster, mit dem du neue Verhaltensweisen an Objekte anhängen kannst, indem du diese Objekte in speziellen Wrapper-Objekten platzierst, die die Verhaltensweisen enthalten.

Klassendiagramm

Implementierung

Client.cs
Component component = new ConcreteDecorator2(
    component: new ConcreteDecorator1(
        component: new ConcreteDecorator1(
            component: new ConcreteComponent())));

component.Operation();
IComponent.cs
public interface IComponent
{
    void Operation();
}
ConcreteComponent.cs
public class ConcreteComponent : Component
{
    public void Operation()
    {
        Console.WriteLine("ConcreteComponent");
    }
}
Decorator.cs
public abstract class Decorator(Component component) : Component
{
    protected Component _component = component;

    public virtual void Operation()
    {
        _component.Operation();
    }
}
ConcreteDecorator1.cs
public abstract class Decorator(Component component) : Component
{
    protected Component _component = component;

    public virtual void Operation()
    {
        _component.Operation();
    }
}
ConcreteDecorator2.cs
public class ConcreteDecorator2(Component component) : Decorator(component)
{
    public override void Operation()
    {
        Console.WriteLine("-------- Concrete Decorator 2 -----------");
        _component.Operation();
        Console.WriteLine("-------- Concrete Decorator 2 -----------");
    }
}

Beispiele

Klassendiagramme

Implementierung

ITeslaModel3 car = new LongRangeTeslaDecorator(
    car: new RedPaintTeslaDecorator(
        car: new BasicTeslaModel3()));

Console.WriteLine($"Description: {car.GetDescription()}");
Console.WriteLine($"Price: {car.GetPrice()}");
Console.WriteLine($"Range: {car.GetRange()}");
public interface ITeslaModel3
{
    decimal GetPrice();
    string GetDescription();
    int GetRange();
}
public class BasicTeslaModel3 : ITeslaModel3
{
    public string GetDescription()
    {
        return "Tesla Model 3 Rear-Wheel Drive";
    }

    public decimal GetPrice()
    {
        return 38990m;
    }

    public int GetRange()
    {
        return 272;
    }
}
public abstract class TeslaDecorator(ITeslaModel3 car) : ITeslaModel3
{
    protected ITeslaModel3 _car = car;

    public virtual string GetDescription()
    {
        return _car.GetDescription();
    }

    public virtual decimal GetPrice()
    {
        return _car.GetPrice();
    }

    public virtual int GetRange()
    {
        return _car.GetRange();
    }
}
public class RedPaintTeslaDecorator(ITeslaModel3 car) : TeslaDecorator(car)
{
    public override decimal GetPrice()
    {
        return base.GetPrice() + 2000;
    }

    public override string GetDescription()
    {
        return $"{base.GetDescription()}, Red Paint";
    }
}
public class LongRangeTeslaDecorator(ITeslaModel3 car) : TeslaDecorator(car)
{
    public override decimal GetPrice()
    {
        return base.GetPrice() + 3500;
    }

    public override string GetDescription()
    {
        return $"{base.GetDescription()}, Long Range";
    }

    public override int GetRange()
    {
        return base.GetRange() + 91;
    }
}
public class BluePaintTeslaDecorator(ITeslaModel3 car) : TeslaDecorator(car)
{
    public override decimal GetPrice()
    {
        return base.GetPrice() + 1000;
    }

    public override string GetDescription()
    {
        return $"{base.GetDescription()}, Blue Paint";
    }
}