我正在尝试用 C++(使用 SDL)做一个小而简单的 GUI。我正在试验 Composite 模式以获得灵活的解决方案。
我有一个 Widget 类,带有 Component 对象:例如,有一个 PaintingComponent ;如果我想绘制一个框,我将使用从 PaintingComponent 继承的 PaintingBoxComponent。
理想的 Widget 类看起来有点像这样:
Class Widget
{
private:
vector<Component*> myComponents;
public:
// A small number of methods able to communicate with the component
// without knowing their types
}
我的问题很简单:在我需要时激活该组件的最佳方式是什么?
我首先在 Widget 类中使用了“显示”功能。但我看到两个问题:
1°) 我在 Widget 中失去了“Compoonent”的纯多态性,因为我被迫将 widget 的特定组件声明为 PaintingComponent。我可以处理这个问题,因为显示一个 Widget 是合乎逻辑的。
2°) 更麻烦的是,我需要在我的主程序和我的 PaintingComponent 之间传递信息。要么我将 SDL_Surface* 屏幕传递给 PaintingComponent,然后它绘制它在其上绘制的图像,要么我为我的组件提供一个对需要接收它绘制的图像的对象的引用(这个对象将绘制图像屏幕)。在这两种情况下,Widget 都必须处理数据,并且必须知道 SDL_Surface* 是什么。我正在松散耦合,我不希望这样。
然后,我考虑使用“访问者”模式,但我不习惯,在尝试实现之前,我想听听您的建议。
在这种情况下,您将如何着手制定灵活可靠的解决方案?提前致谢!
最佳答案
如果您打算稍后更改图形系统,则可以实现此模式。 Visitor 转到根节点,然后递归到所有子节点,将它们绘制在某个表面上(只有 Visitor 自己知道)。您可以用它收集“显示列表”,然后在绘制之前对其进行优化(例如,在 OpenGL 上应用 z 排序(首先降低 z)。
关于c++ - 我的组件需要访问者吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3786191/