#include<iostream>
class DrawAPI{
public:
virtual void drawCircle(int radiux, int x, int y) = 0;
};
class RedCircle : public DrawAPI{
public:
void drawCircle(int radius, int x, int y)override
{
std::cout << "red circle with radius = " << radius << " at (" << x << ", " << y << ")" << std::endl;
}
};
class BlueCircle : public DrawAPI{
public:
void drawCircle(int radius, int x, int y)override
{
std::cout << "blue circle with radius = " << radius << " at (" << x << ", " << y << ")" << std::endl;
}
};
class Shape{
protected:
DrawAPI *api;
Shape(DrawAPI *p) : api(p) { }
virtual void draw() = 0;
virtual ~Shape()
{
if(api){
delete api;
}
}
};
class Circle : public Shape{
private:
int radius, x, y;
public:
Circle(int r, int x, int y, DrawAPI *p) : Shape(p), radius(r), x(x), y(y)
{
}
void draw()override
{
api->drawCircle(radius, x, y);
}
};
void client()
{
Circle red(10, 1, 1, new RedCircle);
red.draw();
Circle blue(5, 2, 2, new BlueCircle);
blue.draw();
}
int main()
{
client();
return 0;
}