序列化对象生成器与访客的哪种设计模式?

时间:2018-09-01 05:40:50

标签: design-patterns builder visitor visitor-pattern builder-pattern

我正在尝试通过示例学习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是有意义的。

现在,哪种方法是正确的?

3 个答案:

答案 0 :(得分:2)

尽管经历了Bill Bickford和Wiki示例的上述博学答复,但可能需要退后一步。

您绝对不需要 Builder Visitor 来创建XMLBuilder或JSONBuilder之类的序列化程序。 CodeBetter链接上的示例试图演示双重发送及其与 Visitor Pattern 的关系。我认为他的榜样充其量是令人困惑的。

例如,C#XMLSerialiser对象将对象构造为XML文档的任何类型。没有访问者或其他任何可见模式!如果需要,有一个单独的过程持久化序列化的文档(到任何存储类型),并且当您将这些操作(序列化和持久性)组合到一组对象上时,这是访问者适用的地方。

访问者模式并没有教数组中的每个对象如何以各种可能的格式存储自身,而是允许另一个对象“访问”并执行存储操作。这几乎与Wiki Visitor示例完全一样,该示例显示了如何保留不同形状的对象,而每个形状都不知道如何保存自己。

因此,您可以独立于Visitor或Builder来研究序列化,因为它们不相关...我认为您对此表示怀疑!如果您是新手,访问者是最难掌握的人之一 .....

答案 1 :(得分:2)

对象(接受者)知道它的结构,串行器(访问者)知道如何记下原始/简单类型。两者结合可以对整个对象图进行序列化/反序列化。那是二进制调度或访问者。

对于语言或程序员来说,以统一的格式公开对象元数据可能更容易,并且在运行时更快,因此任何人/任何人都可以遍历对象图而无需双重调度。甚至在编译对象时使用编译器插件生成编解码器。

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

答案 2 :(得分:1)

学习设计模式的目的是使工具箱具有解决方案的思想,而不是在解决测试问题时遵循教条。

在现实世界中很少有完美的选择。您必须权衡取舍,并决定哪种方法最适合当前的情况。

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

“访问者”模式的Wikipedia entry很好地概述了为什么您可能要选择 Visitor 模式。 “用例示例”尤其直接适用于您的问题。

  

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

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

我认为“访客”模式可以更轻松地满足您的需求。但是,选择权取决于您-这就是软件开发的美丽(和诅咒)!