以正确的顺序Blitting - 访客问题

时间:2010-10-11 10:17:22

标签: user-interface tree composite visitor-pattern

我正在设计一个简单的GUI。我有小工具,有孩子和一个父母。每个Widget都是一个Composite对象,带有WidgetComposite对象的向量。其中一个WidgetComposites是一个PaintingBehaviour,但是Widget并不知道它。

要显示我的窗口,我使用名为ScreenVisitor的访问者。调用访问者时,会发生以下情况:

第一个小部件WidgetScene迭代其每个小部件并调用“accept(Visitor * v)”方法。然后,每个小部件接受访问者,然后迭代其子级。

例如,这是访问者必须接受的对象列表(按照它将要发生的顺序)。

root
    child1
       child2
         child3
       child4
    child5
       child6
    child7

现在,我的问题很简单:我希望每个Widget都在其父级上绘制。你会怎么做?我尝试过一棵树,但我总是遇到同样的问题:当我必须进入层次结构时(例如,在显示child3之后,当我必须显示child4时)我不知道如何获得正确的父母。

我用C ++编码,但这个问题不是特定于语言的。

你有什么想法吗?提前谢谢!

2 个答案:

答案 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或小部件,我会再次这样做)。如果树已经存在,我会直接进入递归绘画。

它有点扭曲(可能还没有完全优化),我承认,但它有效!但如果有人有更好的解决方案,我会非常乐意听到它。