我正在尝试用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 *是什么。我松了松耦合,我不想那样。
然后,我考虑使用“访客”模式,但我不习惯,在我尝试实施之前,我想得到你的建议。
在这种情况下,您将如何获得灵活而可靠的解决方案?提前谢谢!
答案 0 :(得分:1)
如果您打算稍后更改图形系统,则可以实现此模式。访问者转到根节点,然后递归到所有子节点,在某些表面上绘制它们(只有访问者本身知道)。您可以使用它收集“显示列表”,然后在绘制之前对其进行优化(例如,在OpenGL上应用z排序(首先是较低的z)。