Decorator Pattern
Zuletzt aktualisiert
Zuletzt aktualisiert
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.
Component component = new ConcreteDecorator2(
component: new ConcreteDecorator1(
component: new ConcreteDecorator1(
component: new ConcreteComponent())));
component.Operation();
public interface IComponent
{
void Operation();
}
public class ConcreteComponent : Component
{
public void Operation()
{
Console.WriteLine("ConcreteComponent");
}
}
public abstract class Decorator(Component component) : Component
{
protected Component _component = component;
public virtual void Operation()
{
_component.Operation();
}
}
public abstract class Decorator(Component component) : Component
{
protected Component _component = component;
public virtual void Operation()
{
_component.Operation();
}
}
public class ConcreteDecorator2(Component component) : Decorator(component)
{
public override void Operation()
{
Console.WriteLine("-------- Concrete Decorator 2 -----------");
_component.Operation();
Console.WriteLine("-------- Concrete Decorator 2 -----------");
}
}
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";
}
}