gpt4 book ai didi

java - 树结构中的访问者模式

转载 作者:行者123 更新时间:2023-11-30 09:32:01 28 4
gpt4 key购买 nike

我想修改我对树结构和不同节点类型的访问者模式的使用。树结构中的每个节点都必须实现一个回调方法,访问者实现必须为每个节点类型(或至少他感兴趣的类型)实现如下内容:

/**
* Do something when visiting a {@link CommentNode}.
*
* @param pNode
* the {@link CommentNode}
*/
EVisitResult visit(final @Nonnull CommentNode pNode);

/**
* Do something when visiting an {@link ElementNode}.
*
* @param pNode
* the {@link ElementNode}
*/
EVisitResult visit(final @Nonnull ElementNode pNode);

我使用事务游标语义在树结构中导航并提供一个 acceptVisitor 方法,在游标中我实现了以下内容:

@Override
public EVisitResult acceptVisitor(final @Nonnull IVisitor pVisitor) {
assertNotClosed();
return mCurrentNode.acceptVisitor(pVisitor);
}

然而,访问者是 API 中的一个缺陷,因为暴露节点本身,例如 ElementNode 是非常危险的,因为允许对每个节点类型进行的修改应该只能从特定的写事务(实现为游标,提供遍历树结构的方法)。否则,更改在 commit() 期间不可见且不会持久化。

关于如何避免这种情况有什么建议吗?我不知何故怀疑我是否能够提供访问者界面作为方法签名肯定必须不同......

好的,我将提供不可变的“包装器”或代理类:

/** Mutable {@link CommentNode}. */
private final CommentNode mNode;

/**
* Constructor.
*
* @param pNode
* mutable {@link CommentNode}
*/
private ImmutableComment(final @Nonnull CommentNode pNode) {
mNode = checkNotNull(pNode);
}

/**
* Get an immutable comment
*
* @param pNode
* the {@link CommentNode} which should be immutable
* @return an immutable instance
*/
public static ImmutableComment of(final @Nonnull CommentNode pNode) {
return new ImmutableComment(pNode);
}

最佳答案

您可以让游标类使用代理包装您的节点,这将向访问者公开与节点相同的接口(interface)。那么任何访问者都不能直接修改节点。事务逻辑可以放在代理中,或者代理为此委托(delegate)回游标。

关于java - 树结构中的访问者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12667593/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com