public class Circle : Shape
return "Drawing a circle";
public abstract class ShapeDecorator : Shape
public ShapeDecorator(Shape shape)
public void SetShape(Shape shape)
public virtual string Draw()
return this._shape.Draw();
public class RedCircleDecorator: ShapeDecorator
public RedCircleDecorator(Shape shape) : base(shape)
public override string Draw()
var baseResult = base.Draw();
return baseResult + " And making it red";
public void ClientCode(Shape shape)
Console.WriteLine("RESULT: " + shape.Draw());
public static void Main(string[] args)
Client client = new Client();
var circle = new Circle();
Console.WriteLine("Client: I get a simple Circle :");
client.ClientCode(circle);
RedCircleDecorator decorator1 = new RedCircleDecorator(circle);
Console.WriteLine("Client: Now I've got a red Circle :");
client.ClientCode(decorator1);