1.1 目的
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
1.2 动机
当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。
1.3 代码示例
Class Window
{
Public:
Window(View* contents);
Virtual void DrawContents();
Virual void Open();
Virual void Close();
Virual void Iconify();
Virual void Deiconify();
Virual void SetOrigin(const Point& at);
Virual void SetExtent(const Point& extent);
Virual void Raise();
Virual void Lower();
Virual void DrawLine(const Point&, const Point&);
Virual void DrawRect(const Point&, const Point&);
Virual void DrawPolygon(const Point[], int n);
Virual void DrawText(const char*, const Point&);
Protected:
WindowImp* GetWindowImp();
View* GetView();
Private:
WindowImp* _imp;
View* _contents;
};
Window维护一个对WindowImp的引用, WindowImp抽象类定义了一个对底层窗口系统的接口。
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*, Coord, Coord) = 0;
Protected:
WindowImp();
};
VoidWindow::DrawRect(const Point& p1, const Point& p2)
{
WindowImp* imp = GetWindowImp();
Imp->DeviceRect(p1.x(), p1.Y(), p2.X(), p2.Y());
};
--来自《设计模式:可复用面向对象软件的基础》