c++ - 我的组件需要访问者吗?

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

我正在尝试用 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/

相关文章:

c++ - 创建链接数未知的结构节点

java - MVP 到 MVVM Android

javascript - 提交由多个组件组成的表单

forms - 了解 Delphi 窗体是否在运行时或设计时打开

c++ - 跳过变量初始化格式不正确还是会导致不确定的行为?

c++ - 如何获取当前流程的工作对象(如果有)?

c++ - 在C++中使用cuda进行颜色空间转换

MDB 的 Java EE 设计模式

java - 微服务-不同层中变量的定义。设计最佳实践

java - AEM 中的 parsys 组件和响应式布局有什么区别