public interface IDrawingApi
void DrawCircle(double x, double y, double radius);
public abstract class Shape
public IDrawingApi DrawingApi;
public Shape(IDrawingApi drawingApi){
this.DrawingApi = drawingApi;
public abstract void Draw();
public abstract void ResizeByPercentage(double percentage);
public class DrawingApi1 : IDrawingApi
public void DrawCircle(double x, double y, double radius)
Console.WriteLine("API1.circle at {0}, {1} radius {2}", x, y, radius);
public class DrawingApi2 : IDrawingApi
public void DrawCircle(double x, double y, double radius)
Console.WriteLine("API2.circle at {0}, {1} radius {2}", x, y, radius);
public class CircleShape : Shape
private readonly double _x;
private readonly double _y;
public CircleShape(double x, double y, double radius, IDrawingApi drawingApi) : base(drawingApi)
public override void Draw()
this.DrawingApi.DrawCircle(_x, _y, radius);
public override void ResizeByPercentage(double percentage)
public static void Main()
var shapes = new Shape[] {
new CircleShape(1, 2, 3, new DrawingApi1()),
new CircleShape(5, 7, 11, new DrawingApi2()),
foreach (var shape in shapes) {
shape.ResizeByPercentage(2.5);