微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

访问者和迭代器组合

如何解决访问者和迭代器组合

我有一个名为 Binary 的对象,它包含一个只是字符串的引用数组。在解析过程之后,这些引用将产生其他 Binary 对象,当然这些二进制文件可能包含引用等。

看来我正在处理复合模式(复合 Binary 包含另一个复合 Binary 或叶 Binary)。

enter image description here

但是,我对如何以更简洁的方式构建这种复合材料感到困惑。我有以下方法,它将 Binary 作为输入并执行深度优先遍历。

    [NotNull] public Binary ResolveReferences([NotNull] Binary entryPointBinary)
    {
        var compositeBuilder = new CompositeBuilder();
        compositeBuilder.AddBinary(entryPointBinary);
        stack.Push(entryPointBinary);
        while (stack.Any())
        {
            stack.TryPop(out var currentBinary);
            if (!visited.Contains(currentBinary)) visited.Add(currentBinary);
            if (currentBinary.References != null)
            {
                foreach (var reference in currentBinary.References)
                {
                    var resolvedBinary = GetResolvedReference(reference);
                    if (!visited.Contains(resolved))
                        stack.Push(resolved);
                    compositeBuilder.AddBinary(currentBinary,resolved);
                }
            }
        }
        return compositeBuilder.GetResult();

如您所见,这种方法远未尊重单一职责主体。它执行引用解析和构建组合,并在二进制文件上使用 DFS 进行迭代。

我尝试做的:

为了清理这个方法,我想,我会使用迭代器对二进制文件和访问者执行 DFS 来解析每个依赖项的引用。因此,我可以解耦解析逻辑并使用另一个访问者构建每个 Binary 的组合,其中包含一个 Binary(根)和一个由解析引用产生的二进制文件

您可以使用 Visitor 和 Iterator 来遍历复杂的数据 构造并对其元素执行一些操作,即使它们 都有不同的班级。

但是,我发现这与以下引用所述的访问者模式不对应

如果你对每个元素应用相同的操作,或者所有的 元素属于同一类型,您不需要访问者。你需要一个 当您想根据访问者选择不同的操作时 元素类型。

我的问题是:

  • 给定Binary的每个引用的解析过程是否适用于负责解析引用并调用构建器构建对应的Binary的访问者模式?

  • 迭代器模式是否会将执行 DFS 的代码与业务逻辑代码分离?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。