哪个设计模式序列化对象生成器与访问者?

问题描述 投票:0回答:3

我试图通过例子来学习OOPS。所以我尝试实现一个对象序列化器。该对象是相同的,但它可以序列化为XML,JSON等。我看到两种类型的建议。

在这篇博客中,他们说我们可以使用visitor / double dispatch来序列化对象。

http://codebetter.com/jeremymiller/2007/10/31/be-not-afraid-of-the-visitor-the-big-bad-composite-or-their-little-friend-double-dispatch/

但是,根据定义,我们正在从复杂对象构建一个序列化对象,因此创建XMLBuilder和JSONBuilder是有意义的。

现在,这是正确的方法吗?

design-patterns builder visitor visitor-pattern builder-pattern
3个回答
2
投票

尽管上面比尔比克福德和维基示例的学习答复,但可能需要退一步。

您绝对不需要Builder或Visitor来创建XMLBuilder或JSONBuilder等序列化程序。 CodeBetter链接上的示例正在尝试演示双重调度及其与访客模式的关系。在我看来,他的例子充其量是令人困惑的。

例如,C#XMLSerialiser对象可以修改为XML文档构造的任何类型的对象。没有访客或任何其他模式在眼前!如果需要,可以使用单独的进程来保存序列化文档(适用于任何存储类型),并且当您在对象数组上组合这些操作(序列化和持久性)时,这就是访问者适用的位置。

访问者模式允许另一个对象“访问”并执行存储操作,而不是教导数组中的每个对象如何以一系列可能的格式存储自身。这几乎就是Wiki Visitor示例,它展示了如何保持不同的形状对象,而每个形状都知道如何保存自己。

因此,您可以与Visitor或Builder分开学习序列化,因为它们不相关......我认为您怀疑!如果你是模特的新手,访客是最难掌握的......


2
投票

Object(acceptor)知道它的结构,serializer(visitor)知道如何写下原始/简单类型。两者结合起来,他们可以序列化/反序列化整个对象图。这是二元派遣或访客。

然而,在运行时,语言或程序员可以更简单地以统一格式公开对象元数据,因此任何人/任何事物都可以在没有双重调度的情况下遍历对象图。甚至在编译对象时使用编译器插件生成编解码器。

Builder通常与Named Arguments模式一起使用,以使具有多个相似参数的构造对象不易出错(构造函数1可以轻松交换相同类型的两个参数)。它由生成的Protobuf包装器使用,但与反序列化并不严格相关。


1
投票

学习设计模式的关键是用解决方案的想法来填充你的工具包,而不是在解决测试问题时遵循教条。

在现实场景中很少有完美的选择。您必须平衡权衡并确定哪种方法最适合当前的情况。

为什么不尝试这两种方法并评估您对这些方法的喜好?

访客模式的Wikipedia entry可以很好地概述您可能想要选择访客模式的原因。 “用例示例”特别适用于您的问题。

此类型层次结构的基本操作是将绘图保存为系统的本机文件格式。

同样,可以应用Builder pattern。但请注意,此模式的重点是从多个源创建复杂的输出。 Builder正式化了正在进行的工作的概念,允许您收集状态,直到可以生成输出对象。

我认为访客模式更符合您的需求。但是,选择取决于你 - 这就是软件开发的美丽(和诅咒)!

© www.soinside.com 2019 - 2024. All rights reserved.