

class Window
{
public:
Window(View*contents);
// requests handled by window
virtual void DrawContents();
virtual void Open();
virtual void Close();
virtual void Iconify();
virtual void Deiconify();
// requests forwarded to implementation
virtual void SetOrigin(const Points& at);
virtual void SetExtent(const Points& extent);
virtual void Raise();
virtual void Lower();
virtual void DrawLine(const Point&, const Point&);
virtual void DrawRect(const Point&, const Point&);
virtual void DrawPolygon(const Point[], int n);
virtual void DrawText(const char*, const Points&);
protected:
WindowImp* GetWindowImp();
View* GetView();
private:
WindowImp* _imp;
View* _contents;
};
class WindowImp
{
public:
virtual void ImpTop() = 0;
virtual void ImpBottom() = 0;
virtual void ImpSetExtent(const Point&) = 0 ;
virtual void ImpSetOrigin(const Point&) = 0;
virtual void DeviceRect(Coord, Coord, Coord, Coord) = 0;
virtual void DeviceText(const char*, Coord, Coord) = 0;
virtual void DeviceBitmap(const char*, Cood, Coord) = 0;
// lots more functions for drawing on windows...
protected:
WindowImp();
};class ApplicationWindow : public Window
{
public:
virtual void DrawContents();
};
void ApplicationWindow::DrawContents()
{
GetView()->DrawOn(this);
}void Window::DrawRect(const Point& p1,const Point& p2)
{
WindowImp* imp = GetWindowImp();
imp->DeviceRect(p1.X(), p1.Y(), p2.X(), p2.Y());
}class XWindowImp : public WindowImp
{
public:
XWindowImp();
virtual void DeviceRect(Coord, Coord, Coord, Coord);
private:
// lots of X Window system-specific state, including:
Display* _dpy;
Drawable _winid;
GC _gc;
};void XWindowImp::DeviceRect()
{
int x = round(min(x0, x1));
int y = round(min(y0, y1));
int w = round(abs(x0 - x1));
int h = round(abs(x0 - x1));
XDrawRectangle(_dpy, _winid, _gc, x, y, w, h);
}WindowImp * Window::GetWindow()
{
if (_imp == 0)
{
_imp = WindowSystemFactory::Instance()->MakeWindowImp(); // WindowSystemFactory::Instance()函数返回一个抽象工厂
// 该工厂负责处理所有与特定窗口系统相关的对象
// 同时,这个抽象工厂实现称了一个单件(单例模式)
}
return _imp;
}原文:http://blog.csdn.net/zs634134578/article/details/18903939