我的组件需要访问者吗?

时间:2010-09-24 10:35:04

标签: c++ design-patterns components sdl visitor

我正在尝试用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类中的“display”函数。但我看到两个问题:

1°)我在Widget中失去了“Compoonent”的纯多态性,因为我被迫将小部件的特定组件声明为PaintingComponent。我可以处理这个问题,因为显示Widget是合乎逻辑的。

2°)更麻烦的是,我需要在我的主程序和我的PaintingComponent之间传递信息。要么我将SDL_Surface *屏幕传递给PaintingComponent,它会绘制它在其上绘制的图像,或者我向组件提供对需要接收其绘制的图像的对象的引用(此对象将在上面绘制图像)屏幕)。在这两种情况下,Widget都必须处理数据,并且必须知道SDL_Surface *是什么。我松了松耦合,我不想那样。

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

在这种情况下,您将如何获得灵活而可靠的解决方案?提前谢谢!

1 个答案:

答案 0 :(得分:1)

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