我被问到一个理论设计问题,着眼于GoF模式。
给定使用标准访问者模式的树的设计,您的设计将如何允许用户在om预定前、顺序内或顺序后的遍历之间进行选择?
我正在考虑允许访问者访问,但让遍历遵循Iterator模式的Iterator对象。
其想法是实现3个迭代器,以实现所需的遍历。它们有一个接口,访问者只需要与这个接口交互,就可以将自己作为提供遍历的迭代器的一个参数。当给访问者一个迭代器时,用户可以选择使用哪个迭代器。
这听起来像是一个优雅的解决方案吗?有更好的主意吗?
发布于 2014-01-17 20:37:39
游客模式的一件事是误解,认为它与树状结构有某种联系。这是完全错误的。这个问题听起来就像在做那件事。所以第一件事就是纠正这种误解。然后我就像你说的那样。为每种类型的遍历创建3个不同的迭代器。
但这取决于树的复杂性。如果每个节点都有相同的指定的子集合,那么就很容易了。当不同类型的节点具有不同的子节点结构时,问题就开始了。然后访客就开始有意义了。但是不同类型的遍历顺序不再有意义,因为它们只对n数组树工作,而不对每个节点中具有任意类型子节点的树工作。
发布于 2014-01-17 21:02:46
也许我遗漏了一些东西,但是对于每种遍历类型,PreOrderTreeVisitor、InOrderTreeVisitor、PostOrderTreeVisitor以及特定于遍历类型的访问方法都需要不同的访问者。您可能希望它们采取一些可以应用于节点的操作,从而使它们实际上成为树上的迭代器。
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);
}
}https://softwareengineering.stackexchange.com/questions/224583
复制相似问题