我正在设计一个简单的GUI。我有小工具,有孩子和一个父母。每个Widget都是一个Composite对象,带有WidgetComposite对象的向量。其中一个WidgetComposites是一个PaintingBehaviour,但是Widget并不知道它。
要显示我的窗口,我使用名为ScreenVisitor的访问者。调用访问者时,会发生以下情况:
第一个小部件WidgetScene迭代其每个小部件并调用“accept(Visitor * v)”方法。然后,每个小部件接受访问者,然后迭代其子级。
例如,这是访问者必须接受的对象列表(按照它将要发生的顺序)。
root
child1
child2
child3
child4
child5
child6
child7
现在,我的问题很简单:我希望每个Widget都在其父级上绘制。你会怎么做?我尝试过一棵树,但我总是遇到同样的问题:当我必须进入层次结构时(例如,在显示child3之后,当我必须显示child4时)我不知道如何获得正确的父母。
我用C ++编码,但这个问题不是特定于语言的。
你有什么想法吗?提前谢谢!
答案 0 :(得分:0)
这个问题对我来说不是很清楚。如果你只是需要按照正确的顺序绘制它们。在孩子面前的父母,这将是非常容易的:
accept(Visitor v)
paint() //paint parent first
v.visit()
foreach child
child.accept(v) //then paint children
如果您需要父(为什么?),您可以将accept方法更改为(可选)获取父节点。
accept(Visitor v,Element parent = null)
paint()
v.visit()
parent.foo()
foreach child
child.accept(v,this)
答案 1 :(得分:0)
好吧,因为我找不到任何其他东西,我尝试了这个解决方案:
访问者创建一个“DisplayNodes”对象树,它们基本上是一个基本上由指针构成的类。以下是该类的属性:
class DisplayNode
{
private:
Widget* myWidget;
PaintingBehaviour* myPB;
DisplayNode* myParent;
vector <DisplayNode*>myChildren;
};
每个DisplayNode都存储在访问者的矢量中。
然后,对于每个PaintingBehaviour,我测试连接的Widget的父级,并检查我的Node的“myWidget”之一是否是这个父级。所以我可以找回所有内容。之后,它非常简单,DisplayNode中的一个简单的绘制方法,对子节点进行递归调用,使用场景的第一个DisplayNode调用...
由于它有点沉重,我只创建一次DisplayNode树(虽然如果添加/删除了PaintingBehaviour或小部件,我会再次这样做)。如果树已经存在,我会直接进入递归绘画。
它有点扭曲(可能还没有完全优化),我承认,但它有效!但如果有人有更好的解决方案,我会非常乐意听到它。