实现网络协议(XML)的好设计模式是什么?

时间:2014-08-26 16:24:31

标签: java xml parsing design-patterns

我想实现网络协议。为了获得可维护的设计,我正在寻找适合的模式。

协议基于XML,应该用java读取。为了简化讨论,我假设示例语法:

<User>
  <GroupList>
    <Group>group1</Group>
    <Group>group2</Group>
  </GroupList>
</User>

简短问题: 解析这样的东西有什么好的设计模式?

长版: 我发现thisthis question提出了不同的模式(主要是状态模式)。

我的实际(但缺乏)解决方案如下: 我为XML中的每个可能条目创建一个包含数据和解析器的类。因此,我有UserUser.Parser,...作为类。 此外,还有ParserSelectorMap<String,AbstractParser>,其中所有可能的子条目都已注册。 对于每个解析器,ParserSelector被实例化并设置。 例如,ParserSelector的{​​{1}}有一个条目:从字符串GroupList.Parser"Group"的实例的映射。 如果我没有使用Group.Parser类,我必须将这个代码块写入每个解析器。

现在的问题是如何将读取数据传递给超级项目。 ParserSleector会创建一个内容为Group.Parser的{​​{1}}对象。 此对象现在必须在Group对象中注册。 我已阅读过使用访问者或观察者模式,但不了解它们如何适合这里。

我在下面给出一些伪代码来查看问题。 你看,我必须通过group1检查该类型的静态类型信息是不可用的。

我认为应该可以用更清洁(更易于维护)的方式在java中使用多态来解决这个问题。 我总是面对java只对覆盖进行动态绑定的问题。 因此,我无法在GroupList方法中添加参数以允许&#34;远程更新&#34;就像访客/观察者一样。

旁注:真正的语法是&#34;深&#34;也就是说,有很多XML条目(这里只有三个:instanceofXMLParser.parse(...)User),而大多数条目可能只包含很少的不同子条目({{ 1}}和GroupList此处只能包含一个子条目,而Group本身只包含文字。)

这里有一些pseude java代码来解释这个问题:

User

1 个答案:

答案 0 :(得分:0)

完成这个问题:

我最终得到了JAXB。事实上,我不知道它允许从java源代码(使用注释)轻松创建XML Schema。

因此,我只需要使用用于传输的经典java对象编写代码。然后,API很好地处理与XML的转换。