代码之家  ›  专栏  ›  技术社区  ›  Raveline

我的组件需要访客吗?

  •  0
  • Raveline  · 技术社区  · 14 年前

    我试着在C++中使用一个简单的GUI(带有SDL)。我正在试验复合模式以获得灵活的解决方案。

    我有一个带有组件对象的widget类:例如,有一个paintingcomponent;如果我想绘制一个框,我将使用一个paintingboxcomponent,它继承了paintingcomponent。

    理想的小部件类看起来有点像这样:

    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中“component”的纯粹多态性,因为我被迫将widget的特定组件声明为paintingcomponent。我可以处理这个问题,因为显示小部件是合乎逻辑的。

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

    然后,我考虑使用“访问者”模式,但我不习惯,在尝试实现它之前,我想征求您的建议。

    在这种情况下,您将如何获得一个灵活而坚实的解决方案?事先谢谢!

    1 回复  |  直到 14 年前
        1
  •  1
  •   alxx    14 年前

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

    推荐文章