首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用访问者模式设计树,如何实现不同类型的遍历?

使用访问者模式设计树,如何实现不同类型的遍历?
EN

Software Engineering用户
提问于 2014-01-17 20:17:41
回答 2查看 15K关注 0票数 9

我被问到一个理论设计问题,着眼于GoF模式。

给定使用标准访问者模式的树的设计,您的设计将如何允许用户在om预定前、顺序内或顺序后的遍历之间进行选择?

我正在考虑允许访问者访问,但让遍历遵循Iterator模式的Iterator对象。

其想法是实现3个迭代器,以实现所需的遍历。它们有一个接口,访问者只需要与这个接口交互,就可以将自己作为提供遍历的迭代器的一个参数。当给访问者一个迭代器时,用户可以选择使用哪个迭代器。

这听起来像是一个优雅的解决方案吗?有更好的主意吗?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2014-01-17 20:37:39

游客模式的一件事是误解,认为它与树状结构有某种联系。这是完全错误的。这个问题听起来就像在做那件事。所以第一件事就是纠正这种误解。然后我就像你说的那样。为每种类型的遍历创建3个不同的迭代器。

但这取决于树的复杂性。如果每个节点都有相同的指定的子集合,那么就很容易了。当不同类型的节点具有不同的子节点结构时,问题就开始了。然后访客就开始有意义了。但是不同类型的遍历顺序不再有意义,因为它们只对n数组树工作,而不对每个节点中具有任意类型子节点的树工作。

票数 11
EN

Software Engineering用户

发布于 2014-01-17 21:02:46

也许我遗漏了一些东西,但是对于每种遍历类型,PreOrderTreeVisitor、InOrderTreeVisitor、PostOrderTreeVisitor以及特定于遍历类型的访问方法都需要不同的访问者。您可能希望它们采取一些可以应用于节点的操作,从而使它们实际上成为树上的迭代器。

代码语言:javascript
运行
复制
interface ITreeVisitor {
   void visit(ITreeNode node);
}

interface ITreeNode {
   ITreeNode getLeft();
   ITreeNode getRight();
   int getValue();
   void accept(ITreeVisitor visitor);
}

interface IAction {
   void do(ITreeNode);
}

class TreeNode implements ITreeNode {
   ...
   public void accept(ITreeVisitor vistor) {
      visitor.visit(this);
   }
}

class PreOrderTreeVisitor implements ITreeVisitor {

   private IAction action;

   public PreOrderTreeVisitor(IAction action) {
        this.action = action;
   }

   public void visit(ITreeNode node) {

       action.do(node);

       ITreeNode left = node.getLeft();
       if (left != null) left.accept(this);

       ITreeNode right = node.getRight();
       if (right != null) right.accept(this);
   }
}
票数 6
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/224583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档