0

我正在尝试用 C++(使用 SDL)做一个小而简单的 GUI。我正在尝试使用复合模式以获得灵活的解决方案。

我有一个 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°)我失去了小部件中“组件”的纯多态性,因为我被迫将小部件的特定组件声明为绘画组件。我可以处理这个问题,因为应该显示一个小部件是合乎逻辑的。

2°)比较麻烦,我需要在我的主程序和我的绘画组件之间传递信息。要么我将 SDL_Surface* 屏幕传递给 PaintingComponent,然后它绘制它在其上绘制的图像,要么我给我的组件一个对需要接收它绘制的图像的对象的引用(并且这个对象将在其上绘制图像屏幕)。在这两种情况下,Widget 都必须处理数据,并且必须知道 SDL_Surface* 是什么。我正在失去松散耦合,我不希望这样。

然后,我考虑使用“访客”模式,但我不习惯它,在我尝试实现它之前,我想听听你的建议。

在这种情况下,您将如何着手制定灵活而可靠的解决方案?提前致谢 !

4

1 回答 1

1

如果您打算稍后更改图形系统,您可以实现此模式。访问者转到根节点,然后递归到所有子节点,将它们绘制在某个表面上(仅访问者本身知道)。您可以用它收集“显示列表”,然后在绘制之前对其进行优化(例如,在 OpenGL 上应用 z 排序(首先降低 z)。

于 2010-09-24T10:51:45.137 回答