Decorator pattern

The Decorator pattern allows you to dynamically add additional behavior or features to an object at runtime. In the context of a car, let’s create an example with a base Car class, a SportsCar class, and a LuxuryCar class. We’ll use decorators to add extra features to the cars.

First, let’s define the base Car class:

public interface ICar
{
    string GetDescription();
    double GetCost();
}

public class Car : ICar
{
    public string GetDescription()
    {
        return "Basic Car";
    }

    public double GetCost()
    {
        return 20000.0;
    }
}

Next, we’ll create the SportsCar class, which will act as a decorator and add sports car features:

public class SportsCar : ICar
{
    private readonly ICar _car;

    public SportsCar(ICar car)
    {
        _car = car;
    }

    public string GetDescription()
    {
        return _car.GetDescription() + ", Sports Car";
    }

    public double GetCost()
    {
        return _car.GetCost() + 15000.0;
    }
}

Now, let’s create the LuxuryCar class, which will be another decorator to add luxury features:

public class LuxuryCar : ICar
{
    private readonly ICar _car;

    public LuxuryCar(ICar car)
    {
        _car = car;
    }

    public string GetDescription()
    {
        return _car.GetDescription() + ", Luxury Car";
    }

    public double GetCost()
    {
        return _car.GetCost() + 30000.0;
    }
}

Finally, we can use the decorators to create different car configurations:

// Creating a basic car
ICar basicCar = new Car();
Console.WriteLine("Description: " + basicCar.GetDescription());
Console.WriteLine("Cost: $" + basicCar.GetCost());

// Adding sports car features to the basic car
ICar sportsCar = new SportsCar(basicCar);
Console.WriteLine("Description: " + sportsCar.GetDescription());
Console.WriteLine("Cost: $" + sportsCar.GetCost());

// Adding luxury features to the sports car
ICar luxuryCar = new LuxuryCar(sportsCar);
Console.WriteLine("Description: " + luxuryCar.GetDescription());
Console.WriteLine("Cost: $" + luxuryCar.GetCost());

Output:

Description: Basic Car
Cost: $20000
Description: Basic Car, Sports Car
Cost: $35000
Description: Basic Car, Sports Car, Luxury Car
Cost: $65000
Share

Leave a Reply

Your email address will not be published. Required fields are marked *