假设我有一个Item
类的层次结构:Rectangle, Circle, Triangle
。我希望能够绘制它们,所以我的第一种可能是Draw()
向每个虚拟方法添加一个虚拟方法:
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
但是,我想将绘图功能拆分到单独的Draw库中,而Core库仅包含基本表示形式。我可以想到几种可能性:
1-A DrawManager
接受Item
s 的列表,必须使用它dynamic_cast<>
来确定要做什么:
class DrawManager {
void draw(ItemList& items) {
FOREACH(Item* item, items) {
if (dynamic_cast<Rectangle*>(item)) {
drawRectangle();
} else if (dynamic_cast<Circle*>(item)) {
drawCircle();
} ....
}
}
};
这不是理想的选择,因为它依赖于RTTI并迫使一个类了解层次结构中的所有项。
2-另一种方法是将绘图责任推迟到一个ItemDrawer
层次结构(RectangleDrawer
,等):
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
这样可以将项目的基本表示形式与绘图代码之间的关注点分离。但是,问题在于Item类取决于图形类。
如何将此绘图代码分离到单独的库中?解决方案是否返回某些描述的工厂类?但是,如何定义它,以使Core库不依赖Draw库?